@netgrif/components
Version:
Netgrif Application Engine frontend Angular components
151 lines • 50.4 kB
JavaScript
import { Component, Inject, Injector, Optional } from '@angular/core';
import { ComponentPortal } from '@angular/cdk/portal';
import { AbstractTaskPanelComponent, AssignPolicyService, AssignTaskService, BOOLEAN_VALUE_LABEL_ENABLED, CancelTaskService, ChangedFieldsService, DataFocusPolicyService, DelegateTaskService, FinishPolicyService, FinishTaskService, NAE_TASK_FORCE_OPEN, NAE_TASK_OPERATIONS, NAE_TASK_PANEL_DISABLE_BUTTON_FUNCTIONS, SubjectTaskOperations, TaskContentService, TaskDataService, TaskEventService, TaskRequestStateService, FrontActionService, NAE_TAB_DATA, TaskContentServiceFactory, NAE_TASK_CONTENT_SERVICE_TYPE, TaskContentServiceType } from '@netgrif/components-core';
import { TaskContentComponent } from '../../task-content/task-content/task-content.component';
import * as i0 from "@angular/core";
import * as i1 from "@netgrif/components-core";
import * as i2 from "@ngx-translate/core";
import * as i3 from "@angular/common";
import * as i4 from "@ngbracket/ngx-layout";
import * as i5 from "@ngbracket/ngx-layout/extended";
import * as i6 from "@angular/material/button";
import * as i7 from "@angular/material/expansion";
import * as i8 from "@angular/material/icon";
import * as i9 from "@angular/material/menu";
import * as i10 from "@angular/material/progress-spinner";
import * as i11 from "@angular/cdk/portal";
import * as i12 from "../panel.component";
import * as i13 from "../panel-item/panel-item.component";
const taskContentServiceFactory = (serviceFactory, serviceType) => {
if (serviceType === TaskContentServiceType.SINGLE) {
return serviceFactory.createSingleTaskContentService();
}
return serviceFactory.createUnlimitedTaskContentService();
};
export class TaskPanelComponent extends AbstractTaskPanelComponent {
_taskContentService;
_log;
_taskViewService;
_paperView;
_taskEventService;
_assignTaskService;
_delegateTaskService;
_cancelTaskService;
_finishTaskService;
_taskState;
_taskDataService;
_assignPolicyService;
_finishPolicyService;
_callChain;
_translate;
_disableFunctions;
isEnabled;
_parentInjector;
_currencyPipe;
_changedFieldsService;
_permissionService;
_taskForceOpen;
constructor(_taskContentService, _log, _taskViewService, _paperView, _taskEventService, _assignTaskService, _delegateTaskService, _cancelTaskService, _finishTaskService, _taskState, _taskDataService, _assignPolicyService, _finishPolicyService, _callChain, _translate, _taskOperations, _disableFunctions, isEnabled, _parentInjector, _currencyPipe, _changedFieldsService, _permissionService, overflowService, _taskForceOpen, injectedTabData) {
super(_taskContentService, _log, _taskViewService, _paperView, _taskEventService, _assignTaskService, _delegateTaskService, _cancelTaskService, _finishTaskService, _taskState, _taskDataService, _assignPolicyService, _finishPolicyService, _callChain, _taskOperations, _disableFunctions, _translate, _currencyPipe, _changedFieldsService, _permissionService, overflowService, _taskForceOpen, injectedTabData);
this._taskContentService = _taskContentService;
this._log = _log;
this._taskViewService = _taskViewService;
this._paperView = _paperView;
this._taskEventService = _taskEventService;
this._assignTaskService = _assignTaskService;
this._delegateTaskService = _delegateTaskService;
this._cancelTaskService = _cancelTaskService;
this._finishTaskService = _finishTaskService;
this._taskState = _taskState;
this._taskDataService = _taskDataService;
this._assignPolicyService = _assignPolicyService;
this._finishPolicyService = _finishPolicyService;
this._callChain = _callChain;
this._translate = _translate;
this._disableFunctions = _disableFunctions;
this.isEnabled = isEnabled;
this._parentInjector = _parentInjector;
this._currencyPipe = _currencyPipe;
this._changedFieldsService = _changedFieldsService;
this._permissionService = _permissionService;
this._taskForceOpen = _taskForceOpen;
if (_taskForceOpen) {
this.hidePanelHeader = true;
}
}
createContentPortal() {
const providers = [
{ provide: TaskContentService, useValue: this._taskContentService },
{ provide: BOOLEAN_VALUE_LABEL_ENABLED, useValue: this.isEnabled }
];
const injector = Injector.create({ providers, parent: this._parentInjector });
if (this.panelContentComponent === undefined) {
this.portal = new ComponentPortal(TaskContentComponent, null, injector);
}
else {
this.portal = new ComponentPortal(this.panelContentComponent, null, injector);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskPanelComponent, deps: [{ token: i1.TaskContentService }, { token: i1.LoggerService }, { token: i1.TaskViewService }, { token: i1.PaperViewService }, { token: i1.TaskEventService }, { token: i1.AssignTaskService }, { token: i1.DelegateTaskService }, { token: i1.CancelTaskService }, { token: i1.FinishTaskService }, { token: i1.TaskRequestStateService }, { token: i1.TaskDataService }, { token: i1.AssignPolicyService }, { token: i1.FinishPolicyService }, { token: i1.CallChainService }, { token: i2.TranslateService }, { token: NAE_TASK_OPERATIONS }, { token: NAE_TASK_PANEL_DISABLE_BUTTON_FUNCTIONS, optional: true }, { token: BOOLEAN_VALUE_LABEL_ENABLED, optional: true }, { token: i0.Injector }, { token: i3.CurrencyPipe }, { token: i1.ChangedFieldsService }, { token: i1.PermissionService }, { token: i1.OverflowService, optional: true }, { token: NAE_TASK_FORCE_OPEN, optional: true }, { token: NAE_TAB_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TaskPanelComponent, selector: "nc-task-panel", providers: [
{ provide: TaskContentService, useFactory: taskContentServiceFactory, deps: [TaskContentServiceFactory, NAE_TASK_CONTENT_SERVICE_TYPE] },
TaskDataService,
FrontActionService,
TaskEventService,
AssignTaskService,
DelegateTaskService,
CancelTaskService,
FinishTaskService,
TaskRequestStateService,
DataFocusPolicyService,
AssignPolicyService,
FinishPolicyService,
ChangedFieldsService,
{ provide: NAE_TASK_OPERATIONS, useClass: SubjectTaskOperations },
], usesInheritance: true, ngImport: i0, template: "<nc-app-panel [panelContent]=\"taskPanelContent\" [panelHeader]=\"taskPanelHeader\"\n (stopLoading)=\"stopLoading()\" (getExpansionPanelRef)=\"setPanelRef($event)\" [first]=\"first\" [last]=\"last\"\n [preventCollapse]='preventCollapse' [hidePanelHeader]='hidePanelHeader' [preventExpand]=\"preventExpand\">\n <ng-template #taskPanelHeader>\n <div fxLayoutAlign=\"start center\" fxLayout=\"row\" fxFlex=\"95\" (click)=\"preventSelectionClick($event)\">\n <div *ngFor=\"let field of featuredFieldsValues; let i = index\" fxFlex\n class=\"text-column-div\"\n [fxHide.lt-xl]=\"i >= 4 && responsiveBody && !overflowMode\"\n [fxHide.lt-lg]=\"i >= 3 && responsiveBody && !overflowMode\"\n [fxHide.lt-md]=\"i >= 2 && responsiveBody && !overflowMode\"\n [fxHide.lt-sm]=\"i >= 1 && responsiveBody && !overflowMode\"\n [ngClass]=\"{'panel-header-padding': !textEllipsis && field.type !== 'button'}\">\n <nc-panel-item\n [leadingIcon]=\"taskPanelData.task.icon\"\n [leadingIconEnabled]=\"i === 0\"\n [featuredValue]=\"field\"\n [textEllipsis]=\"textEllipsis\">\n </nc-panel-item>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" fxFlex=\"5\">\n <button mat-icon-button (click)=\"preventPanelOpen($event)\"\n *ngIf=\"!isLoading && showMoreMenu && (canAssign() || canDo('delegate') || canReassign() || canCancel() || canFinish())\"\n [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item *ngIf=\"canAssign()\" (click)=\"assign()\" [disabled]=\"canDisable('assign')\">\n <mat-icon>person</mat-icon>\n <span>{{ getAssignTitle() | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canDo('delegate')\" (click)=\"delegate()\"\n [disabled]=\"canDisable('delegate')\">\n <mat-icon>person_outline</mat-icon>\n <span>{{ getDelegateTitle() | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canReassign()\" (click)=\"delegate()\" [disabled]=\"canDisable('reassign')\">\n <mat-icon>person_add</mat-icon>\n <span>{{ 'tasks.view.reassign' | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canCancel()\" (click)=\"cancel()\" [disabled]=\"canDisable('cancel')\">\n <mat-icon>cancel</mat-icon>\n <span>{{ getCancelTitle() | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canFinish()\" (click)=\"finish()\" [disabled]=\"canDisable('finish')\">\n <mat-icon>done</mat-icon>\n <span>{{ getFinishTitle() | translate}}</span>\n </button>\n </mat-menu>\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"30\"></mat-spinner>\n </div>\n </ng-template>\n <ng-template #taskPanelContent>\n <div class=\"panel-main-content\" fxLayout=\"column\"\n [ngStyle]=\"(isForceOpen() && {'min-height': getContentMinHeight()}) || null\">\n <div class=\"task-panel-body\" [ngClass]=\"{'paper-view': isPaperView()}\" fxFlex=\"100\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </div>\n <mat-action-row *ngIf=\"!hideActionRow\" fxLayout.lt-sm=\"column\" [ngStyle]=\"{'justify-content': actionRowJustifyContent ?? 'flex-end' }\">\n <mat-spinner class='action-row-spinner' *ngIf=\"isLoading && hidePanelHeader\"\n [diameter]=\"20\"></mat-spinner>\n <div fxLayoutAlign.lt-sm=\"center stretch\" ngClass.lt-sm=\"width-100\"\n *ngFor='let button of (!!actionButtonTemplates && actionButtonTemplates.length > 0 ?\n actionButtonTemplates : [assignButton, delegateButton, reassignButton, cancelButton, finishButton, collapseButton])'>\n <ng-container *ngTemplateOutlet='button; context:thisContext'></ng-container>\n </div>\n </mat-action-row>\n </div>\n </ng-template>\n</nc-app-panel>\n\n<ng-template #assignButton>\n <button *ngIf=\"canAssign() && getAssignTitle()?.length > 0\" (click)=\"assign()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('assign')\">\n {{ getAssignTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #delegateButton>\n <button *ngIf=\"canDo('delegate') && getDelegateTitle()?.length > 0\" (click)=\"delegate()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('delegate')\">\n {{ getDelegateTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #reassignButton>\n <button *ngIf=\"canReassign()\" (click)=\"delegate()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('reassign')\">\n {{ 'tasks.view.reassign' | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #cancelButton>\n <button *ngIf=\"canCancel() && getCancelTitle()?.length > 0\" (click)=\"cancel()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('cancel')\">\n {{ getCancelTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #finishButton>\n <button *ngIf=\"canFinish() && getFinishTitle()?.length > 0\" (click)=\"finish()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('finish')\">\n {{ getFinishTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #collapseButton>\n <button *ngIf=\"canCollapse() && !this.preventCollapse\" color=\"primary\" (click)=\"collapse()\" mat-stroked-button color=\"primary\">\n {{ 'tasks.view.collapse' | translate | uppercase }}</button>\n</ng-template>\n", styles: [".task-panel-icon{margin-right:8px}.task-panel-footer{border-top:1px solid rgba(0,0,0,.03);padding:5px 24px}.task-panel-body{padding:10px 24px}.paper-view{margin:auto}.width-100{width:100%}.text-column-ellipsis{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.text-column-word-wrap{word-break:break-word!important;white-space:pre-line!important}.text-column-div{min-width:0;width:0}.text-column-margin{margin-right:15px;line-height:24px}.panel-header-padding{padding:9px 0!important}.pre-line-dialog{white-space:pre-line!important}.action-row-spinner{box-sizing:border-box;width:20px;height:20px;display:inline;margin:auto 5px}@media only screen and (max-width: 959.99px){.task-panel-body{padding:10px 0}.task-panel-action-row{padding:8px}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i5.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i5.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i5.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i7.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i11.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: i12.PanelComponent, selector: "nc-app-panel" }, { kind: "component", type: i13.PanelItemComponent, selector: "nc-panel-item" }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskPanelComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-task-panel', providers: [
{ provide: TaskContentService, useFactory: taskContentServiceFactory, deps: [TaskContentServiceFactory, NAE_TASK_CONTENT_SERVICE_TYPE] },
TaskDataService,
FrontActionService,
TaskEventService,
AssignTaskService,
DelegateTaskService,
CancelTaskService,
FinishTaskService,
TaskRequestStateService,
DataFocusPolicyService,
AssignPolicyService,
FinishPolicyService,
ChangedFieldsService,
{ provide: NAE_TASK_OPERATIONS, useClass: SubjectTaskOperations },
], template: "<nc-app-panel [panelContent]=\"taskPanelContent\" [panelHeader]=\"taskPanelHeader\"\n (stopLoading)=\"stopLoading()\" (getExpansionPanelRef)=\"setPanelRef($event)\" [first]=\"first\" [last]=\"last\"\n [preventCollapse]='preventCollapse' [hidePanelHeader]='hidePanelHeader' [preventExpand]=\"preventExpand\">\n <ng-template #taskPanelHeader>\n <div fxLayoutAlign=\"start center\" fxLayout=\"row\" fxFlex=\"95\" (click)=\"preventSelectionClick($event)\">\n <div *ngFor=\"let field of featuredFieldsValues; let i = index\" fxFlex\n class=\"text-column-div\"\n [fxHide.lt-xl]=\"i >= 4 && responsiveBody && !overflowMode\"\n [fxHide.lt-lg]=\"i >= 3 && responsiveBody && !overflowMode\"\n [fxHide.lt-md]=\"i >= 2 && responsiveBody && !overflowMode\"\n [fxHide.lt-sm]=\"i >= 1 && responsiveBody && !overflowMode\"\n [ngClass]=\"{'panel-header-padding': !textEllipsis && field.type !== 'button'}\">\n <nc-panel-item\n [leadingIcon]=\"taskPanelData.task.icon\"\n [leadingIconEnabled]=\"i === 0\"\n [featuredValue]=\"field\"\n [textEllipsis]=\"textEllipsis\">\n </nc-panel-item>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" fxFlex=\"5\">\n <button mat-icon-button (click)=\"preventPanelOpen($event)\"\n *ngIf=\"!isLoading && showMoreMenu && (canAssign() || canDo('delegate') || canReassign() || canCancel() || canFinish())\"\n [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item *ngIf=\"canAssign()\" (click)=\"assign()\" [disabled]=\"canDisable('assign')\">\n <mat-icon>person</mat-icon>\n <span>{{ getAssignTitle() | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canDo('delegate')\" (click)=\"delegate()\"\n [disabled]=\"canDisable('delegate')\">\n <mat-icon>person_outline</mat-icon>\n <span>{{ getDelegateTitle() | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canReassign()\" (click)=\"delegate()\" [disabled]=\"canDisable('reassign')\">\n <mat-icon>person_add</mat-icon>\n <span>{{ 'tasks.view.reassign' | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canCancel()\" (click)=\"cancel()\" [disabled]=\"canDisable('cancel')\">\n <mat-icon>cancel</mat-icon>\n <span>{{ getCancelTitle() | translate}}</span>\n </button>\n <button mat-menu-item *ngIf=\"canFinish()\" (click)=\"finish()\" [disabled]=\"canDisable('finish')\">\n <mat-icon>done</mat-icon>\n <span>{{ getFinishTitle() | translate}}</span>\n </button>\n </mat-menu>\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"30\"></mat-spinner>\n </div>\n </ng-template>\n <ng-template #taskPanelContent>\n <div class=\"panel-main-content\" fxLayout=\"column\"\n [ngStyle]=\"(isForceOpen() && {'min-height': getContentMinHeight()}) || null\">\n <div class=\"task-panel-body\" [ngClass]=\"{'paper-view': isPaperView()}\" fxFlex=\"100\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </div>\n <mat-action-row *ngIf=\"!hideActionRow\" fxLayout.lt-sm=\"column\" [ngStyle]=\"{'justify-content': actionRowJustifyContent ?? 'flex-end' }\">\n <mat-spinner class='action-row-spinner' *ngIf=\"isLoading && hidePanelHeader\"\n [diameter]=\"20\"></mat-spinner>\n <div fxLayoutAlign.lt-sm=\"center stretch\" ngClass.lt-sm=\"width-100\"\n *ngFor='let button of (!!actionButtonTemplates && actionButtonTemplates.length > 0 ?\n actionButtonTemplates : [assignButton, delegateButton, reassignButton, cancelButton, finishButton, collapseButton])'>\n <ng-container *ngTemplateOutlet='button; context:thisContext'></ng-container>\n </div>\n </mat-action-row>\n </div>\n </ng-template>\n</nc-app-panel>\n\n<ng-template #assignButton>\n <button *ngIf=\"canAssign() && getAssignTitle()?.length > 0\" (click)=\"assign()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('assign')\">\n {{ getAssignTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #delegateButton>\n <button *ngIf=\"canDo('delegate') && getDelegateTitle()?.length > 0\" (click)=\"delegate()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('delegate')\">\n {{ getDelegateTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #reassignButton>\n <button *ngIf=\"canReassign()\" (click)=\"delegate()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('reassign')\">\n {{ 'tasks.view.reassign' | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #cancelButton>\n <button *ngIf=\"canCancel() && getCancelTitle()?.length > 0\" (click)=\"cancel()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('cancel')\">\n {{ getCancelTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #finishButton>\n <button *ngIf=\"canFinish() && getFinishTitle()?.length > 0\" (click)=\"finish()\" mat-stroked-button color=\"primary\" [disabled]=\"canDisable('finish')\">\n {{ getFinishTitle() | translate | uppercase }}</button>\n</ng-template>\n\n<ng-template #collapseButton>\n <button *ngIf=\"canCollapse() && !this.preventCollapse\" color=\"primary\" (click)=\"collapse()\" mat-stroked-button color=\"primary\">\n {{ 'tasks.view.collapse' | translate | uppercase }}</button>\n</ng-template>\n", styles: [".task-panel-icon{margin-right:8px}.task-panel-footer{border-top:1px solid rgba(0,0,0,.03);padding:5px 24px}.task-panel-body{padding:10px 24px}.paper-view{margin:auto}.width-100{width:100%}.text-column-ellipsis{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.text-column-word-wrap{word-break:break-word!important;white-space:pre-line!important}.text-column-div{min-width:0;width:0}.text-column-margin{margin-right:15px;line-height:24px}.panel-header-padding{padding:9px 0!important}.pre-line-dialog{white-space:pre-line!important}.action-row-spinner{box-sizing:border-box;width:20px;height:20px;display:inline;margin:auto 5px}@media only screen and (max-width: 959.99px){.task-panel-body{padding:10px 0}.task-panel-action-row{padding:8px}}\n"] }]
}], ctorParameters: () => [{ type: i1.TaskContentService }, { type: i1.LoggerService }, { type: i1.TaskViewService }, { type: i1.PaperViewService }, { type: i1.TaskEventService }, { type: i1.AssignTaskService }, { type: i1.DelegateTaskService }, { type: i1.CancelTaskService }, { type: i1.FinishTaskService }, { type: i1.TaskRequestStateService }, { type: i1.TaskDataService }, { type: i1.AssignPolicyService }, { type: i1.FinishPolicyService }, { type: i1.CallChainService }, { type: i2.TranslateService }, { type: i1.SubjectTaskOperations, decorators: [{
type: Inject,
args: [NAE_TASK_OPERATIONS]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_TASK_PANEL_DISABLE_BUTTON_FUNCTIONS]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [BOOLEAN_VALUE_LABEL_ENABLED]
}] }, { type: i0.Injector }, { type: i3.CurrencyPipe }, { type: i1.ChangedFieldsService }, { type: i1.PermissionService }, { type: i1.OverflowService, decorators: [{
type: Optional
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_TASK_FORCE_OPEN]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_TAB_DATA]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMvc3JjL2xpYi9wYW5lbC90YXNrLXBhbmVsL3Rhc2stcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvcGFuZWwvdGFzay1wYW5lbC90YXNrLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsMkJBQTJCLEVBRTNCLGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUVuQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBRWpCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsdUNBQXVDLEVBSXZDLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsa0JBQWtCLEVBQ2xCLFlBQVksRUFFWix5QkFBeUIsRUFDekIsNkJBQTZCLEVBQzdCLHNCQUFzQixFQUN6QixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdEQUF3RCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFJNUYsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLGNBQXlDLEVBQUUsV0FBbUMsRUFBRSxFQUFFO0lBQ2pILElBQUksV0FBVyxLQUFLLHNCQUFzQixDQUFDLE1BQU0sRUFBRTtRQUMvQyxPQUFP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bUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLGlCQUFpQjt3QkFDakIsdUJBQXVCO3dCQUN2QixzQkFBc0I7d0JBQ3RCLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixvQkFBb0I7d0JBQ3BCLEVBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBQztxQkFDbEU7OzBCQW1CWSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsdUNBQXVDOzswQkFDMUQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQywyQkFBMkI7OzBCQUs5QyxRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQ3RDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIEluamVjdG9yLCBPcHRpb25hbCwgU3RhdGljUHJvdmlkZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb21wb25lbnRQb3J0YWx9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFRhc2tQYW5lbENvbXBvbmVudCxcbiAgICBBc3NpZ25Qb2xpY3lTZXJ2aWNlLFxuICAgIEFzc2lnblRhc2tTZXJ2aWNlLFxuICAgIEJPT0xFQU5fVkFMVUVfTEFCRUxfRU5BQkxFRCxcbiAgICBDYWxsQ2hhaW5TZXJ2aWNlLFxuICAgIENhbmNlbFRhc2tTZXJ2aWNlLFxuICAgIENoYW5nZWRGaWVsZHNTZXJ2aWNlLFxuICAgIERhdGFGb2N1c1BvbGljeVNlcnZpY2UsXG4gICAgRGVsZWdhdGVUYXNrU2VydmljZSxcbiAgICBEaXNhYmxlQnV0dG9uRnVudGlvbnMsXG4gICAgRmluaXNoUG9saWN5U2VydmljZSxcbiAgICBGaW5pc2hUYXNrU2VydmljZSxcbiAgICBMb2dnZXJTZXJ2aWNlLFxuICAgIE5BRV9UQVNLX0ZPUkNFX09QRU4sXG4gICAgTkFFX1RBU0tfT1BFUkFUSU9OUyxcbiAgICBOQUVfVEFTS19QQU5FTF9ESVNBQkxFX0JVVFRPTl9GVU5DVElPTlMsXG4gICAgT3ZlcmZsb3dTZXJ2aWNlLFxuICAgIFBhcGVyVmlld1NlcnZpY2UsXG4gICAgUGVybWlzc2lvblNlcnZpY2UsXG4gICAgU3ViamVjdFRhc2tPcGVyYXRpb25zLFxuICAgIFRhc2tDb250ZW50U2VydmljZSxcbiAgICBUYXNrRGF0YVNlcnZpY2UsXG4gICAgVGFza0V2ZW50U2VydmljZSxcbiAgICBUYXNrUmVxdWVzdFN0YXRlU2VydmljZSxcbiAgICBUYXNrVmlld1NlcnZpY2UsXG4gICAgRnJvbnRBY3Rpb25TZXJ2aWNlLFxuICAgIE5BRV9UQUJfREFUQSxcbiAgICBJbmplY3RlZFRhYkRhdGEsIFNpbXBsZUZpbHRlcixcbiAgICBUYXNrQ29udGVudFNlcnZpY2VGYWN0b3J5LFxuICAgIE5BRV9UQVNLX0NPTlRFTlRfU0VSVklDRV9UWVBFLFxuICAgIFRhc2tDb250ZW50U2VydmljZVR5cGVcbn0gZnJvbSAnQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlJztcbmltcG9ydCB7VGFza0NvbnRlbnRDb21wb25lbnR9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC90YXNrLWNvbnRlbnQvdGFzay1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtDdXJyZW5jeVBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmNvbnN0IHRhc2tDb250ZW50U2VydmljZUZhY3RvcnkgPSAoc2VydmljZUZhY3Rvcnk6IFRhc2tDb250ZW50U2VydmljZUZhY3RvcnksIHNlcnZpY2VUeXBlOiBUYXNrQ29udGVudFNlcnZpY2VUeXBlKSA9PiB7XG4gICAgaWYgKHNlcnZpY2VUeXBlID09PSBUYXNrQ29udGVudFNlcnZpY2VUeXBlLlNJTkdMRSkge1xuICAgICAgICByZXR1cm4gc2VydmljZUZhY3RvcnkuY3JlYXRlU2luZ2xlVGFza0NvbnRlbnRTZXJ2aWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlRmFjdG9yeS5jcmVhdGVVbmxpbWl0ZWRUYXNrQ29udGVudFNlcnZpY2UoKTtcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmMtdGFzay1wYW5lbCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Rhc2stcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IFRhc2tDb250ZW50U2VydmljZSwgdXNlRmFjdG9yeTogdGFza0NvbnRlbnRTZXJ2aWNlRmFjdG9yeSwgZGVwczogW1Rhc2tDb250ZW50U2VydmljZUZhY3RvcnksIE5BRV9UQVNLX0NPTlRFTlRfU0VSVklDRV9UWVBFXX0sXG4gICAgICAgIFRhc2tEYXRhU2VydmljZSxcbiAgICAgICAgRnJvbnRBY3Rpb25TZXJ2aWNlLFxuICAgICAgICBUYXNrRXZlbnRTZXJ2aWNlLFxuICAgICAgICBBc3NpZ25UYXNrU2VydmljZSxcbiAgICAgICAgRGVsZWdhdGVUYXNrU2VydmljZSxcbiAgICAgICAgQ2FuY2VsVGFza1NlcnZpY2UsXG4gICAgICAgIEZpbmlzaFRhc2tTZXJ2aWNlLFxuICAgICAgICBUYXNrUmVxdWVzdFN0YXRlU2VydmljZSxcbiAgICAgICAgRGF0YUZvY3VzUG9saWN5U2VydmljZSxcbiAgICAgICAgQXNzaWduUG9saWN5U2VydmljZSxcbiAgICAgICAgRmluaXNoUG9saWN5U2VydmljZSxcbiAgICAgICAgQ2hhbmdlZEZpZWxkc1NlcnZpY2UsXG4gICAgICAgIHtwcm92aWRlOiBOQUVfVEFTS19PUEVSQVRJT05TLCB1c2VDbGFzczogU3ViamVjdFRhc2tPcGVyYXRpb25zfSxcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhc2tQYW5lbENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0VGFza1BhbmVsQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrVmlld1NlcnZpY2U6IFRhc2tWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3BhcGVyVmlldzogUGFwZXJWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tFdmVudFNlcnZpY2U6IFRhc2tFdmVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hc3NpZ25UYXNrU2VydmljZTogQXNzaWduVGFza1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9kZWxlZ2F0ZVRhc2tTZXJ2aWNlOiBEZWxlZ2F0ZVRhc2tTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY2FuY2VsVGFza1NlcnZpY2U6IENhbmNlbFRhc2tTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZmluaXNoVGFza1NlcnZpY2U6IEZpbmlzaFRhc2tTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1N0YXRlOiBUYXNrUmVxdWVzdFN0YXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tEYXRhU2VydmljZTogVGFza0RhdGFTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfYXNzaWduUG9saWN5U2VydmljZTogQXNzaWduUG9saWN5U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2ZpbmlzaFBvbGljeVNlcnZpY2U6IEZpbmlzaFBvbGljeVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jYWxsQ2hhaW46IENhbGxDaGFpblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQEluamVjdChOQUVfVEFTS19PUEVSQVRJT05TKSBfdGFza09wZXJhdGlvbnM6IFN1YmplY3RUYXNrT3BlcmF0aW9ucyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9UQVNLX1BBTkVMX0RJU0FCTEVfQlVUVE9OX0ZVTkNUSU9OUykgcHJvdGVjdGVkIF9kaXNhYmxlRnVuY3Rpb25zOiBEaXNhYmxlQnV0dG9uRnVudGlvbnMsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChCT09MRUFOX1ZBTFVFX0xBQkVMX0VOQUJMRUQpIHByb3RlY3RlZCBpc0VuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wYXJlbnRJbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlOiBDaGFuZ2VkRmllbGRzU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Blcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBvdmVyZmxvd1NlcnZpY2U6IE92ZXJmbG93U2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9UQVNLX0ZPUkNFX09QRU4pIHByb3RlY3RlZCBfdGFza0ZvcmNlT3BlbjogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9UQUJfREFUQSkgaW5qZWN0ZWRUYWJEYXRhOiBJbmplY3RlZFRhYkRhdGEpIHtcbiAgICAgICAgc3VwZXIoX3Rhc2tDb250ZW50U2VydmljZSwgX2xvZywgX3Rhc2tWaWV3U2VydmljZSwgX3BhcGVyVmlldywgX3Rhc2tFdmVudFNlcnZpY2UsIF9hc3NpZ25UYXNrU2VydmljZSxcbiAgICAgICAgICAgIF9kZWxlZ2F0ZVRhc2tTZXJ2aWNlLCBfY2FuY2VsVGFza1NlcnZpY2UsIF9maW5pc2hUYXNrU2VydmljZSwgX3Rhc2tTdGF0ZSwgX3Rhc2tEYXRhU2VydmljZSxcbiAgICAgICAgICAgIF9hc3NpZ25Qb2xpY3lTZXJ2aWNlLCBfZmluaXNoUG9saWN5U2VydmljZSwgX2NhbGxDaGFpbiwgX3Rhc2tPcGVyYXRpb25zLCBfZGlzYWJsZUZ1bmN0aW9ucywgX3RyYW5zbGF0ZSwgX2N1cnJlbmN5UGlwZSwgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLFxuICAgICAgICAgICAgX3Blcm1pc3Npb25TZXJ2aWNlLCBvdmVyZmxvd1NlcnZpY2UsIF90YXNrRm9yY2VPcGVuLCBpbmplY3RlZFRhYkRhdGEpO1xuICAgICAgICBpZiAoX3Rhc2tGb3JjZU9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVBhbmVsSGVhZGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVDb250ZW50UG9ydGFsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwcm92aWRlcnM6IEFycmF5PFN0YXRpY1Byb3ZpZGVyPiA9IFtcbiAgICAgICAgICAgIHtwcm92aWRlOiBUYXNrQ29udGVudFNlcnZpY2UsIHVzZVZhbHVlOiB0aGlzLl90YXNrQ29udGVudFNlcnZpY2V9LFxuICAgICAgICAgICAge3Byb3ZpZGU6IEJPT0xFQU5fVkFMVUVfTEFCRUxfRU5BQkxFRCwgdXNlVmFsdWU6IHRoaXMuaXNFbmFibGVkfVxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7cHJvdmlkZXJzLCBwYXJlbnQ6IHRoaXMuX3BhcmVudEluamVjdG9yfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGFuZWxDb250ZW50Q29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChUYXNrQ29udGVudENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKHRoaXMucGFuZWxDb250ZW50Q29tcG9uZW50LCBudWxsLCBpbmplY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmMtYXBwLXBhbmVsIFtwYW5lbENvbnRlbnRdPVwidGFza1BhbmVsQ29udGVudFwiIFtwYW5lbEhlYWRlcl09XCJ0YXNrUGFuZWxIZWFkZXJcIlxuICAgICAgICAgICAgICAoc3RvcExvYWRpbmcpPVwic3RvcExvYWRpbmcoKVwiIChnZXRFeHBhbnNpb25QYW5lbFJlZik9XCJzZXRQYW5lbFJlZigkZXZlbnQpXCIgW2ZpcnN0XT1cImZpcnN0XCIgW2xhc3RdPVwibGFzdFwiXG4gICAgICAgICAgICAgIFtwcmV2ZW50Q29sbGFwc2VdPSdwcmV2ZW50Q29sbGFwc2UnIFtoaWRlUGFuZWxIZWFkZXJdPSdoaWRlUGFuZWxIZWFkZXInIFtwcmV2ZW50RXhwYW5kXT1cInByZXZlbnRFeHBhbmRcIj5cbiAgICA8bmctdGVtcGxhdGUgI3Rhc2tQYW5lbEhlYWRlcj5cbiAgICAgICAgPGRpdiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeEZsZXg9XCI5NVwiIChjbGljayk9XCJwcmV2ZW50U2VsZWN0aW9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmVhdHVyZWRGaWVsZHNWYWx1ZXM7IGxldCBpID0gaW5kZXhcIiBmeEZsZXhcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNvbHVtbi1kaXZcIlxuICAgICAgICAgICAgICAgICBbZnhIaWRlLmx0LXhsXT1cImkgPj0gNCAmJiByZXNwb25zaXZlQm9keSAmJiAhb3ZlcmZsb3dNb2RlXCJcbiAgICAgICAgICAgICAgICAgW2Z4SGlkZS5sdC1sZ109XCJpID49IDMgJiYgcmVzcG9uc2l2ZUJvZHkgJiYgIW92ZXJmbG93TW9kZVwiXG4gICAgICAgICAgICAgICAgIFtmeEhpZGUubHQtbWRdPVwiaSA+PSAyICYmIHJlc3BvbnNpdmVCb2R5ICYmICFvdmVyZmxvd01vZGVcIlxuICAgICAgICAgICAgICAgICBbZnhIaWRlLmx0LXNtXT1cImkgPj0gMSAmJiByZXNwb25zaXZlQm9keSAmJiAhb3ZlcmZsb3dNb2RlXCJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydwYW5lbC1oZWFkZXItcGFkZGluZyc6ICF0ZXh0RWxsaXBzaXMgJiYgZmllbGQudHlwZSAhPT0gJ2J1dHRvbid9XCI+XG4gICAgICAgICAgICAgICAgPG5jLXBhbmVsLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgW2xlYWRpbmdJY29uXT1cInRhc2tQYW5lbERhdGEudGFzay5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2xlYWRpbmdJY29uRW5hYmxlZF09XCJpID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZlYXR1cmVkVmFsdWVdPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dEVsbGlwc2lzXT1cInRleHRFbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgIDwvbmMtcGFuZWwtaXRlbT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCIgZnhGbGV4PVwiNVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInByZXZlbnRQYW5lbE9wZW4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzTG9hZGluZyAmJiBzaG93TW9yZU1lbnUgJiYgKGNhbkFzc2lnbigpIHx8IGNhbkRvKCdkZWxlZ2F0ZScpIHx8IGNhblJlYXNzaWduKCkgfHwgY2FuQ2FuY2VsKCkgfHwgY2FuRmluaXNoKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdJZj1cImNhbkFzc2lnbigpXCIgKGNsaWNrKT1cImFzc2lnbigpXCIgW2Rpc2FibGVkXT1cImNhbkRpc2FibGUoJ2Fzc2lnbicpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5wZXJzb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRBc3NpZ25UaXRsZSgpIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0lmPVwiY2FuRG8oJ2RlbGVnYXRlJylcIiAoY2xpY2spPVwiZGVsZWdhdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FuRGlzYWJsZSgnZGVsZWdhdGUnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cGVyc29uX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXREZWxlZ2F0ZVRpdGxlKCkgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nSWY9XCJjYW5SZWFzc2lnbigpXCIgKGNsaWNrKT1cImRlbGVnYXRlKClcIiBbZGlzYWJsZWRdPVwiY2FuRGlzYWJsZSgncmVhc3NpZ24nKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cGVyc29uX2FkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICd0YXNrcy52aWV3LnJlYXNzaWduJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdJZj1cImNhbkNhbmNlbCgpXCIgKGNsaWNrKT1cImNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImNhbkRpc2FibGUoJ2NhbmNlbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRDYW5jZWxUaXRsZSgpIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0lmPVwiY2FuRmluaXNoKClcIiAoY2xpY2spPVwiZmluaXNoKClcIiBbZGlzYWJsZWRdPVwiY2FuRGlzYWJsZSgnZmluaXNoJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRvbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRGaW5pc2hUaXRsZSgpIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nXCIgW2RpYW1ldGVyXT1cIjMwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI3Rhc2tQYW5lbENvbnRlbnQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1tYWluLWNvbnRlbnRcIiBmeExheW91dD1cImNvbHVtblwiXG4gICAgICAgICAgICAgW25nU3R5bGVdPVwiKGlzRm9yY2VPcGVuKCkgJiYgeydtaW4taGVpZ2h0JzogZ2V0Q29udGVudE1pbkhlaWdodCgpfSkgfHwgbnVsbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhc2stcGFuZWwtYm9keVwiIFtuZ0NsYXNzXT1cInsncGFwZXItdmlldyc6IGlzUGFwZXJWaWV3KCl9XCIgZnhGbGV4PVwiMTAwXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtjZGtQb3J0YWxPdXRsZXRdPVwicG9ydGFsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG1hdC1hY3Rpb24tcm93ICpuZ0lmPVwiIWhpZGVBY3Rpb25Sb3dcIiBmeExheW91dC5sdC1zbT1cImNvbHVtblwiIFtuZ1N0eWxlXT1cInsnanVzdGlmeS1jb250ZW50JzogYWN0aW9uUm93SnVzdGlmeUNvbnRlbnQgPz8gJ2ZsZXgtZW5kJyB9XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPSdhY3Rpb24tcm93LXNwaW5uZXInICpuZ0lmPVwiaXNMb2FkaW5nICYmIGhpZGVQYW5lbEhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaWFtZXRlcl09XCIyMFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dEFsaWduLmx0LXNtPVwiY2VudGVyIHN0cmV0Y2hcIiBuZ0NsYXNzLmx0LXNtPVwid2lkdGgtMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj0nbGV0IGJ1dHRvbiBvZiAoISFhY3Rpb25CdXR0b25UZW1wbGF0ZXMgJiYgYWN0aW9uQnV0dG9uVGVtcGxhdGVzLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25CdXR0b25UZW1wbGF0ZXMgOiBbYXNzaWduQnV0dG9uLCBkZWxlZ2F0ZUJ1dHRvbiwgcmVhc3NpZ25CdXR0b24sIGNhbmNlbEJ1dHRvbiwgZmluaXNoQnV0dG9uLCBjb2xsYXBzZUJ1dHRvbl0pJz5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0nYnV0dG9uOyBjb250ZXh0OnRoaXNDb250ZXh0Jz48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWFjdGlvbi1yb3c+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG48L25jLWFwcC1wYW5lbD5cblxuPG5nLXRlbXBsYXRlICNhc3NpZ25CdXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNhbkFzc2lnbigpICYmIGdldEFzc2lnblRpdGxlKCk/Lmxlbmd0aCA+IDBcIiAoY2xpY2spPVwiYXNzaWduKClcIiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImNhbkRpc2FibGUoJ2Fzc2lnbicpXCI+XG4gICAgICAgIHt7IGdldEFzc2lnblRpdGxlKCkgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX08L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVsZWdhdGVCdXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNhbkRvKCdkZWxlZ2F0ZScpICYmIGdldERlbGVnYXRlVGl0bGUoKT8ubGVuZ3RoID4gMFwiIChjbGljayk9XCJkZWxlZ2F0ZSgpXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJjYW5EaXNhYmxlKCdkZWxlZ2F0ZScpXCI+XG4gICAgICAgIHt7IGdldERlbGVnYXRlVGl0bGUoKSB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyZWFzc2lnbkJ1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiY2FuUmVhc3NpZ24oKVwiIChjbGljayk9XCJkZWxlZ2F0ZSgpXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJjYW5EaXNhYmxlKCdyZWFzc2lnbicpXCI+XG4gICAgICAgIHt7ICd0YXNrcy52aWV3LnJlYXNzaWduJyB8IHRyYW5zbGF0ZSB8IHVwcGVyY2FzZSB9fTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjYW5jZWxCdXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNhbkNhbmNlbCgpICYmIGdldENhbmNlbFRpdGxlKCk/Lmxlbmd0aCA+IDBcIiAoY2xpY2spPVwiY2FuY2VsKClcIiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImNhbkRpc2FibGUoJ2NhbmNlbCcpXCI+XG4gICAgICAgIHt7IGdldENhbmNlbFRpdGxlKCkgfCB0cmFuc2xhdGUgfCB1cHBlcmNhc2UgfX08L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZmluaXNoQnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJjYW5GaW5pc2goKSAmJiBnZXRGaW5pc2hUaXRsZSgpPy5sZW5ndGggPiAwXCIgKGNsaWNrKT1cImZpbmlzaCgpXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJjYW5EaXNhYmxlKCdmaW5pc2gnKVwiPlxuICAgICAgICB7eyBnZXRGaW5pc2hUaXRsZSgpIHwgdHJhbnNsYXRlIHwgdXBwZXJjYXNlIH19PC9idXR0b24+XG48L25nL