Commit 94fda9f2 by GD-A-150752

edit-workflow-template 90%

parent 7d463ed7
......@@ -14,7 +14,6 @@ import { AdminPortalLayoutService } from './components/admin-portal/admin-portal
import { ApplicantPortalLayoutComponent } from './components/applicant-portal/applicant-portal-layout/applicant-portal-layout.component';
import { ApplicantPortalLayoutService } from './components/applicant-portal/applicant-portal-layout/applicant-portal-layout.service';
import { EditMessageTemplateComponent } from './components/edit-message-template/edit-message-template.component';
import { EditMessageTemplateService } from './components/edit-message-template/edit-message-template.service';
import { EditWorkflowTemplateComponent } from './components/edit-workflow-template/edit-workflow-template.component';
import { EditWorkflowTemplateService } from './components/edit-workflow-template/edit-workflow-template.service';
import { ErrorMessageComponent } from './components/error-message/error-message.component';
......@@ -55,7 +54,6 @@ import { OneITModule } from './oneit/oneit.module';
AdminPortalLayoutService,
ApplicantPortalLayoutService,
AppService,
EditMessageTemplateService,
EditWorkflowTemplateService
],
bootstrap: [AppComponent]
......
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { MessageTemplateModel } from "./models/messageTemplate.model";
import { PlaceholderOptionsEnum } from './models/placeholderOptions.enum';
import { TemplateTypeEnum } from './models/templateType.enum';
import { EnumService } from './oneit/services/enum.service';
......@@ -39,4 +40,17 @@ export class AppService {
this.utilsService.convertResponseToObjects(data, assocs)
);
}
getMessageTemplateByID(id, assocs): Observable<MessageTemplateModel> {
return this.searchService.getObjectById('MessageTemplates', id, assocs)
.map(
data => {
const objs = this.utilsService.convertResponseToObjects(data, assocs);
if (objs && objs.length > 0) {
return objs[0];
}
}
);
}
}
......@@ -6,54 +6,43 @@
</div>
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-12">
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-4 s-a-center">
<label>Message Template</label>
</div>
<div class="ui-g-12 ui-md-4 ui-fluid">
<div class="form-group row">
<div class="col-md-6">
<label for="MessageTemplate{{messageTemplate.ObjectID}}">Message Template</label>
<input [(ngModel)]="messageTemplate.TemplateName"
name="MessageTemplate{{messageTemplate.ObjectID}}"
fieldLabel="Message Template" type="text" [disabled]="showLoader" pInputText
class="form-control ui-inputtext" id="MessageTemplate{{messageTemplate.ObjectID}}">
</div>
</div>
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-4">
<label>Message Template Type</label>
fieldLabel="Message Template" type="text" [disabled]="showLoader"
class="form-control" id="MessageTemplate{{messageTemplate.ObjectID}}">
</div>
<div class="ui-g-12 ui-md-4 ui-fluid"
<div class="col-md-6"
*ngIf="this.messageTemplateTypes.length && this.messageTemplate && this.messageTemplate.TemplateType">
<label for="select">Message Template Type</label>
<app-select-2 [data]="messageTemplateTypes" [value]="templateTypeId"
fieldLabel="Description"
fieldLabel="Description" id="select"
(valChange)="storeMessageContent($event)">
</app-select-2>
</div>
</div>
<div class="ui-g form-group" *ngIf="emailTemplateType()">
<div class="ui-g-12 ui-md-4 s-a-center">
<label>Subject</label>
</div>
<div class="ui-g-12 ui-md-4 ui-fluid">
<div class="form-group row">
<div class="col-md-6">
<label for="subjectInputId">Subject</label>
<input id="subjectInputId" [(ngModel)]="messageTemplate.Subject"
name="Subject{{messageTemplate.ObjectID}}"
fieldLabel="Subject" placeholder="Subject" type="text" pInputText
class="form-control ui-inputtext"
fieldLabel="Subject" placeholder="Subject" type="text"
class="form-control"
[disabled]="showLoader">
</div>
<div class="ui-g-12 ui-md-4" *ngIf="subjectPlaceholderOptions.length">
<div class="col-md-6" *ngIf="subjectPlaceholderOptions.length">
<label>Placeholder for Subject</label>
<app-select-2 [data]="subjectPlaceholderOptions" [value]="0"
fieldLabel="Description"
(valChange)="addPlaceholderInSubject($event)">
</app-select-2>
</div>
</div>
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-4">
<label> Message Content </label>
</div>
<div class="ui-g-12 ui-md-4" *ngIf="emailTemplateType()">
</div>
<div class="ui-g-12 ui-md-4" *ngIf="contentPlaceholderOptions.length">
<div class="form-group row">
<div class="col-md-offset-6 col-md-6" *ngIf="contentPlaceholderOptions.length">
<label>Placeholder for Content</label>
<app-select-2 [data]="contentPlaceholderOptions" [value]="0"
fieldLabel="Description"
(valChange)="addPlaceholderInMessageContent($event)">
......@@ -73,8 +62,9 @@
</p-overlayPanel>
</div>
</div>
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-12">
<div class="form-group row">
<div class="col-md-12">
<label>Message Content</label>
<p-editor *ngIf="emailTemplateType()" [(ngModel)]="messageTemplate.MessageContent"
name="MessageContent{{messageTemplate.ObjectID}}"
#messageContent
......@@ -102,12 +92,17 @@
<div class="ui-g-12 ui-md-12">
<div class="text-center form-group">
<button type="button" value="Cancel" class="btn btn-primary largeBtn greyBtn"
routerLink="/admin/list-message-templates">Cancel
(click)="cancelClicked()">Cancel
</button>
<button *ngIf="showSaveBtn()" type="button" value="Save" class="btn btn-primary largeBtn"
(click)="saveMessageTemplate()" [disabled]="showLoader">
Save
</button>
<button *ngIf="showSaveIntoAllTemplates()" type="button" value="Save into all templates"
class="btn btn-primary largeBtn"
(click)="saveMessageTemplate()" [disabled]="showLoader">
Save into all templates
</button>
<button *ngIf="showSaveCopyBtn()" type="button" value="Save As a Copy"
class="btn btn-primary largeBtn"
(click)="saveMessageTemplate(true)" [disabled]="showLoader">
......
import { Component, OnInit, ViewChild } from '@angular/core';
import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
import { NgForm } from '@angular/forms';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { Editor } from 'primeng/editor';
......@@ -13,7 +13,6 @@ import { SaveService } from '../../oneit/services/save.service';
import { UtilsService } from '../../oneit/services/utils.service';
import { AdminPortalLayoutService } from '../admin-portal/admin-portal-layout/admin-portal-layout.service';
import { BaseComponent } from '../base/base.component';
import { EditMessageTemplateService } from './edit-message-template.service';
@Component({
selector: 'app-edit-message-template',
......@@ -21,6 +20,10 @@ import { EditMessageTemplateService } from './edit-message-template.service';
})
export class EditMessageTemplateComponent extends BaseComponent implements OnInit {
@Input() objectID: string;
// tslint:disable-next-line:prefer-output-readonly
@Output() closeModal: EventEmitter<any> = new EventEmitter<any>();
subscriptions: Array<Subscription> = [];
@ViewChild('form') form: NgForm;
@ViewChild('messageContent') messageContentEditor: Editor;
......@@ -50,7 +53,6 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
private utilsService: UtilsService,
private saveService: SaveService,
private appService: AppService,
private editMessageTemplateService: EditMessageTemplateService,
private adminPortalLayoutService: AdminPortalLayoutService
) {
super(utilsService);
......@@ -83,7 +85,7 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
.subscribe(
data => {
if (this.createdExists()) {
if (this.alreadyExists()) {
return;
}
......@@ -93,10 +95,10 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
.subscribe(
(params: Params) => {
if (params.id && params.id !== '0') {
if ((params.id && params.id !== '0') || this.templateUpdateFromWorkflow()) {
this.editMode = true;
this.getMessageTemplateByID(params.id);
this.getMessageTemplateByID(this.templateUpdateFromWorkflow() ? this.objectID : params.id);
} else {
this.messageTemplate.HiringTeam = this.adminPortalLayoutService.getHiringTeamID().ObjectID;
......@@ -126,6 +128,11 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
!this.editMode) : false;
}
showSaveIntoAllTemplates(): boolean {
return !!this.messageTemplate && !!this.messageTemplate.ObjectID &&
(!this.alreadyExists() && !this.messageTemplate.IsSystemGenerated && !!this.objectID);
}
showSaveCopyBtn(): boolean {
return this.messageTemplate && this.messageTemplate.ObjectID ?
(!!this.messageTemplate.HiringTeam) : false;
......@@ -299,10 +306,11 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
this.utilsService.resetCounter();
this.utilsService.clearErrorMessages();
this.subscriptions.push(this.editMessageTemplateService.getMessageTemplateByID(id, [])
this.subscriptions.push(this.appService.getMessageTemplateByID(id, [])
.subscribe(
data => {
this.messageTemplate = data;
this.updatedObjs[this.messageTemplate.ObjectID] = this.messageTemplate;
this.templateTypeId =
this.messageTemplateTypes.find(elem => elem.Value === this.messageTemplate.TemplateType.Value).id;
this.showLoader = false;
......@@ -316,6 +324,25 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
);
}
// If new message template is being created from 'EditWorkFlowComponent'
templateCreationFromWorkflow(): boolean {
return this.objectID && this.objectID.indexOf('NEW') !== -1;
}
// If a message template is being updated from 'EditWorkFlowComponent'
templateUpdateFromWorkflow(): boolean {
return this.objectID && this.objectID.indexOf('NEW') === -1;
}
cancelClicked(): void {
// If new message template is being created from 'EditWorkFlowComponent'
if (this.templateCreationFromWorkflow() || this.templateUpdateFromWorkflow()) {
this.closeModal.emit(-1);
} else {
this.router.navigate(['/admin/list-message-templates']);
}
}
saveMessageTemplate(saveCopy = false): void {
this.utilsService.clearErrorMessages();
const service = `svc/${saveCopy ? SERVICES.SAVE_MESSAGE_AS_COPY : SERVICES.SAVE}`;
......@@ -326,9 +353,20 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
this.showLoader = true;
this.subscriptions.push(this.saveService.saveObjects(service, this.createdObjs, this.updatedObjs, this.deletedObjs)
.subscribe(
() => {
data => {
this.utilsService.handleSuccess();
this.router.navigate(['/admin/list-message-templates']);
if (this.templateCreationFromWorkflow()) {
let id = this.messageTemplate.ObjectID;
if (data.created[id]) {
id = data.created[id];
}
this.closeModal.emit(id);
} else if (this.templateUpdateFromWorkflow()) {
this.closeModal.emit(this.messageTemplate.ObjectID);
} else {
this.router.navigate(['/admin/list-message-templates']);
}
},
error => {
this.showLoader = false;
......@@ -397,8 +435,8 @@ export class EditMessageTemplateComponent extends BaseComponent implements OnIni
}, 0);
}
createdExists(): boolean {
return Object.keys(this.createdObjs).length > 0;
alreadyExists(): boolean {
return Object.keys(this.createdObjs).length > 0 || Object.keys(this.updatedObjs).length > 0;
}
// tslint:disable-next-line:max-file-line-count
......
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { MessageTemplateModel } from '../../models/messageTemplate.model';
import { SearchService } from '../../oneit/services/search.service';
import { UtilsService } from '../../oneit/services/utils.service';
@Injectable()
export class EditMessageTemplateService {
constructor(
private searchService: SearchService,
private utilsService: UtilsService
) {
}
getMessageTemplateByID(id, assocs): Observable<MessageTemplateModel> {
return this.searchService.getObjectById('MessageTemplates', id, assocs)
.map(
data => {
const objs = this.utilsService.convertResponseToObjects(data, assocs);
if (objs && objs.length > 0) {
return objs[0];
}
}
);
}
}
......@@ -7,22 +7,25 @@
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-12">
<div class="ui-g form-group">
<p-dialog header="Message Template" [(visible)]="displayNewMessageTemplate">
<app-edit-message-template></app-edit-message-template>
<p-dialog header="Message Template" [(visible)]="displayNewMessageTemplate" #messageTemplateDialog>
<app-edit-message-template *ngIf="displayNewMessageTemplate"
[objectID]="selectedTemplateID"
(closeModal)="closeDialog($event)"></app-edit-message-template>
</p-dialog>
<div class="ui-g-12 ui-g-offset-4 ui-md-4">
<label for="TemplateNameId" (click)="toggleInput($event, 'TemplateName')"
*ngIf="showLabel('TemplateName')">{{workflow.TemplateName}}</label>
<input id="TemplateNameId" *ngIf="showInput('TemplateName')" pInputText
[(ngModel)]="workflow.TemplateName"
[(ngModel)]="workflow.TemplateName" [disabled]="showLoader"
(blur)="toggleInput($event, 'TemplateName')"
name="TemplateName" required/>
</div>
</div>
<!-- Start Pre stages -->
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-12">
<p-panel *ngFor="let stage of filteredStages(true, false)" toggler="header"
[toggleable]="true" [collapsed]="true">
[toggleable]="true">
<p-header>
<span class="ui-panel-title" *ngIf="showStageLabel('StageName'+stage.ObjectID, stage)"
(click)="toggleStageInput($event, 'StageName'+stage.ObjectID, stage)">
......@@ -38,7 +41,7 @@
<label for="LandingButtonText">Button Text</label>
<input name="LandingButtonText" type="text" class="form-control"
id="LandingButtonText"
[(ngModel)]="workflow.LandingButtonText"
[(ngModel)]="workflow.LandingButtonText" [disabled]="showLoader"
fieldLabel="Landing Button Text"
tabindex="1" required>
</div>
......@@ -49,7 +52,7 @@
<div class="col-md-12">
<label for="VerificationHeaderText">Header Text</label>
<input name="VerificationHeaderText" type="text" class="form-control"
id="VerificationHeaderText"
id="VerificationHeaderText" [disabled]="showLoader"
[(ngModel)]="workflow.VerificationHeaderText"
fieldLabel="Verification Header Text"
tabindex="2" required>
......@@ -63,7 +66,8 @@
<label> Capture CV </label>
</div>
<div class="ui-g-12 ui-md-2">
<p-inputSwitch [(ngModel)]="workflow.CaptureCV" name="CaptureCV">
<p-inputSwitch [(ngModel)]="workflow.CaptureCV" name="CaptureCV"
[disabled]="showLoader">
</p-inputSwitch>
</div>
</div>
......@@ -73,6 +77,7 @@
</div>
<div class="ui-g-12 ui-md-2">
<p-inputSwitch [(ngModel)]="workflow.IsCVMandatory"
[disabled]="showLoader"
name="IsCVMandatory">
</p-inputSwitch>
</div>
......@@ -84,7 +89,8 @@
<label>Capture Cover Letter</label>
</div>
<div class="ui-g-12 ui-md-2">
<p-inputSwitch [(ngModel)]="workflow.CaptureCL" name="CaptureCL">
<p-inputSwitch [(ngModel)]="workflow.CaptureCL" name="CaptureCL"
[disabled]="showLoader">
</p-inputSwitch>
</div>
</div>
......@@ -94,6 +100,7 @@
</div>
<div class="ui-g-12 ui-md-2">
<p-inputSwitch [(ngModel)]="workflow.IsCLMandatory"
[disabled]="showLoader"
name="IsCLMandatory">
</p-inputSwitch>
</div>
......@@ -104,6 +111,7 @@
<label>Button Text</label>
<input name="ApplicationButtonText" type="text" class="form-control"
[(ngModel)]="workflow.ApplicationButtonText"
[disabled]="showLoader"
fieldLabel="Application Button Text"
tabindex="7" required>
</div>
......@@ -124,7 +132,7 @@
<div class="col-md-6">
<label for="ThankYouHeaderText">Header Text for Thank You page</label>
<input name="ThankYouHeaderText" [(ngModel)]="workflow.ThankYouHeaderText"
id="ThankYouHeaderText"
id="ThankYouHeaderText" [disabled]="showLoader"
type="text" class="form-control"
fieldLabel="Header Text for Thank You page"
tabindex="8" required>
......@@ -132,7 +140,7 @@
<div class="col-md-6">
<label for="ThankYouSecondaryText">Secondary Text</label>
<input name="ThankYouSecondaryText" id="ThankYouSecondaryText"
[(ngModel)]="workflow.ThankYouSecondaryText"
[(ngModel)]="workflow.ThankYouSecondaryText" [disabled]="showLoader"
fieldLabel="Secondary Text" type="text" class="form-control"
tabindex="9">
</div>
......@@ -144,7 +152,7 @@
<label for="JobOutlineButtonText">Button Text</label>
<input name="JobOutlineButtonText" id="JobOutlineButtonText"
[(ngModel)]="workflow.JobOutlineButtonText"
type="text" class="form-control"
type="text" class="form-control" [disabled]="showLoader"
fieldLabel="Job Outline Button Text"
tabindex="10" required>
</div>
......@@ -156,7 +164,7 @@
<div class="col-md-6">
<h3>Steps</h3>
</div>
<div class="col-md-offset-2 col-md-4" *ngIf="stepTypes.length">
<div class="col-md-offset-2 col-md-4" *ngIf="stepTypes && stepTypes.length">
<app-select-2 [data]="stepTypes" [value]="0"
fieldLabel="Description"
(valChange)="addStep($event, stage)">
......@@ -172,6 +180,7 @@
</div>
<div class="col-md-2">
<button type="button" pButton label=" " icon="ui-icon-close"
[disabled]="showLoader"
(click)="removeStep(step, stage)"></button>
</div>
<div class="col-md-6"></div>
......@@ -188,7 +197,7 @@
<label> Automatically progress to next stage </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.AutoProgress"
<p-inputSwitch [(ngModel)]="stage.AutoProgress" [disabled]="showLoader"
name="AutoProgress{{stage.ObjectID}}">
</p-inputSwitch>
</div>
......@@ -198,7 +207,7 @@
<label> Use messaging </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.UseMessaging"
<p-inputSwitch [(ngModel)]="stage.UseMessaging" [disabled]="showLoader"
name="UseMessaging{{stage.ObjectID}}">
</p-inputSwitch>
</div>
......@@ -208,6 +217,7 @@
<div class="form-group row">
<div class="col-md-offset-9 col-md-3">
<button class="btn btn-primary add-more-btn" tabindex="11"
[disabled]="showLoader"
(click)="addMessage(stage)">Add Message
</button>
</div>
......@@ -221,7 +231,7 @@
<div class="col-md-2">
<label>After</label>
<p-inputMask name="Delay{{message.ObjectID}}"
class="form-control"
class="form-control" [disabled]="showLoader"
id="Delay{{message.ObjectID}}"
[(ngModel)]="message.Delay"
characterPattern="[(\d+\:\d+\:\d+)|(\d+\:\d+)|(\d+)]"
......@@ -237,7 +247,7 @@
<label for="Variance{{message.ObjectID}}">+/-</label>
<input name="Variance{{message.ObjectID}}"
id="Variance{{message.ObjectID}}"
[(ngModel)]="message.Variance"
[(ngModel)]="message.Variance" [disabled]="showLoader"
type="text" class="form-control">
</div>
<div class="col-md-2">
......@@ -268,9 +278,10 @@
</p-dropdown>
</div>
<div class="col-md-2 text-center">
<button type="button" pButton label=" "
icon="ui-icon-settings"></button>
<button type="button" pButton label=" "
<button type="button" pButton label=" " [disabled]="showLoader"
icon="ui-icon-settings"
(click)="configureMessageTemplate(message)"></button>
<button type="button" pButton label=" " [disabled]="showLoader"
icon="ui-icon-close"
*ngIf="!message.IsWithdrawalMessage"
(click)="removeMessage(message, stage)"></button>
......@@ -287,186 +298,184 @@
</p-panel>
</div>
</div>
<!-- End Pre stages -->
<div class="row">
<div class="col-md-6 text-right">
<h3>Stages</h3>
</div>
<div class="col-md-3 col-md-offset-3">
<button class="btn btn-primary add-more-btn" tabindex="11"
<button class="btn btn-primary add-more-btn" tabindex="11" [disabled]="showLoader"
(click)="addStage()">Add Stage
</button>
</div>
</div>
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-12">
<p-orderList [value]="filteredStages(false, false)" header="Stages"
dragdrop="true">
<ng-template let-stage pTemplate="item">
<div>
<p-panel toggler="header" [toggleable]="true" [collapsed]="true">
<p-header>
<p-panel *ngFor="let stage of filteredStages(false, false)" toggler="header"
[toggleable]="true">
<p-header>
<span class="ui-panel-title" *ngIf="showStageLabel('StageName'+stage.SortOrder, stage)"
(click)="toggleStageInput($event, 'StageName'+stage.SortOrder, stage)">
{{getStageHeader(stage)}}
</span>
<input id="StageName{{stage.SortOrder}}Id"
*ngIf="showStageInput('StageName'+stage.SortOrder, stage)"
pInputText
[(ngModel)]="stage.Name"
(blur)="toggleStageInput($event, 'StageName'+stage.SortOrder, stage)"
name="StageName{{stage.SortOrder}}" required/>
</p-header>
<div class="ui-g form-group">
<!-- Start steps section -->
<div class="ui-g-12 ui-md-12" *ngIf="!stage.StageType.IsPostStage">
<div class="form-group row">
<div class="col-md-offset-8 col-md-4" *ngIf="stepTypes.length">
<app-select-2 [data]="stepTypes" [value]="0"
fieldLabel="Description"
(valChange)="addStep($event, stage)">
</app-select-2>
</div>
<input id="StageName{{stage.SortOrder}}Id"
*ngIf="showStageInput('StageName'+stage.SortOrder, stage)"
pInputText [disabled]="showLoader"
[(ngModel)]="stage.Name"
(blur)="toggleStageInput($event, 'StageName'+stage.SortOrder, stage)"
name="StageName{{stage.SortOrder}}" required/>
</p-header>
<div class="ui-g form-group">
<!-- Start steps section -->
<div class="ui-g-12 ui-md-12" *ngIf="!stage.StageType.IsPostStage">
<div class="form-group row">
<div class="col-md-offset-8 col-md-4" *ngIf="stepTypes && stepTypes.length">
<app-select-2 [data]="stepTypes" [value]="0"
fieldLabel="Description"
(valChange)="addStep($event, stage)">
</app-select-2>
</div>
</div>
<p-orderList [value]="stage.Steps" header="Steps"
dragdrop="true" (onReorder)="reAssignStepOrders(stage)">
<ng-template let-step pTemplate="item">
<div class="drag-block">
<div class="col-md-4">
<h4>{{step.StepType.Description}}</h4>
</div>
<p-orderList [value]="stage.Steps" header="Steps"
dragdrop="true" (onReorder)="reAssignStepOrders(stage)">
<ng-template let-step pTemplate="item">
<div class="drag-block">
<div class="col-md-4">
<h4>{{step.StepType.Description}}</h4>
</div>
<div class="col-md-2">
<button type="button" pButton label=" "
icon="ui-icon-close"
(click)="removeStep(step, stage)"></button>
</div>
<div class="col-md-6"></div>
</div>
</ng-template>
</p-orderList>
<hr/>
<div class="col-md-2">
<button type="button" pButton label=" " [disabled]="showLoader"
icon="ui-icon-close"
(click)="removeStep(step, stage)"></button>
</div>
<div class="col-md-6"></div>
</div>
</ng-template>
</p-orderList>
<hr/>
</div>
<!-- End steps section -->
<!-- Start messaging section -->
<div class="ui-g-12 ui-md-12">
<div class="form-group row">
<div class="ui-g-12 ui-md-6">
<label> Automatically progress to next stage </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.AutoProgress" [disabled]="showLoader"
name="AutoProgress{{stage.ObjectID}}">
</p-inputSwitch>
</div>
</div>
<div class="form-group row">
<div class="ui-g-12 ui-md-6">
<label> Use messaging </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.UseMessaging" [disabled]="showLoader"
name="UseMessaging{{stage.ObjectID}}">
</p-inputSwitch>
</div>
</div>
<p-panel header="{{stageMessagesCount(stage)}}" [toggleable]="true"
[collapsed]="!stage.UseMessaging">
<div class="form-group row">
<div class="col-md-offset-9 col-md-3">
<button class="btn btn-primary add-more-btn" tabindex="11"
[disabled]="showLoader"
(click)="addMessage(stage)">Add Message
</button>
</div>
</div>
<!-- Display Messages here -->
<div class="form-group row"
*ngFor="let message of stage.WorkFlowMessages">
<div class="col-lg-12 col-md-12"
*ngIf="message.IsWithdrawalMessage">
<h3>Withdrawal Process</h3>
</div>
<!-- End steps section -->
<!-- Start messaging section -->
<div class="ui-g-12 ui-md-12">
<div class="form-group row">
<div class="ui-g-12 ui-md-6">
<label> Automatically progress to next stage </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.AutoProgress"
name="AutoProgress{{stage.ObjectID}}">
</p-inputSwitch>
</div>
<div class="col-lg-12 col-md-12">
<div class="col-md-2">
<label>After</label>
<p-inputMask name="Delay{{message.ObjectID}}"
class="form-control"
id="Delay{{message.ObjectID}}"
[(ngModel)]="message.Delay" [disabled]="showLoader"
characterPattern="[(\d+\:\d+\:\d+)|(\d+\:\d+)|(\d+)]"
*ngIf="showDelayInput('Delay'+message.ObjectID, message)"
(onBlur)="toggleDelayInput($event, 'Delay'+message.ObjectID,message)"
mask="99:99:99">
</p-inputMask>
<label
(click)="toggleDelayInput($event, 'Delay'+message.ObjectID,message)"
*ngIf="showDelayLabel('Delay'+message.ObjectID, message)">{{message.Delay}}</label>
</div>
<div class="form-group row">
<div class="ui-g-12 ui-md-6">
<label> Use messaging </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.UseMessaging"
name="UseMessaging{{stage.ObjectID}}">
</p-inputSwitch>
</div>
<div class="col-md-2">
<label for="Variance{{message.ObjectID}}">+/-</label>
<input name="Variance{{message.ObjectID}}"
id="Variance{{message.ObjectID}}"
[(ngModel)]="message.Variance" [disabled]="showLoader"
type="text" class="form-control">
</div>
<p-panel header="{{stageMessagesCount(stage)}}" [toggleable]="true"
[collapsed]="!stage.UseMessaging">
<div class="form-group row">
<div class="col-md-offset-9 col-md-3">
<button class="btn btn-primary add-more-btn" tabindex="11"
(click)="addMessage(stage)">Add Message
</button>
</div>
</div>
<!-- Display Messages here -->
<div class="form-group row"
*ngFor="let message of stage.WorkFlowMessages">
<div class="col-lg-12 col-md-12"
*ngIf="message.IsWithdrawalMessage">
<h3>Withdrawal Process</h3>
</div>
<div class="col-lg-12 col-md-12">
<div class="col-md-2">
<label>After</label>
<p-inputMask name="Delay{{message.ObjectID}}"
class="form-control"
id="Delay{{message.ObjectID}}"
[(ngModel)]="message.Delay"
characterPattern="[(\d+\:\d+\:\d+)|(\d+\:\d+)|(\d+)]"
*ngIf="showDelayInput('Delay'+message.ObjectID, message)"
(onBlur)="toggleDelayInput($event, 'Delay'+message.ObjectID,message)"
mask="99:99:99">
</p-inputMask>
<label
(click)="toggleDelayInput($event, 'Delay'+message.ObjectID,message)"
*ngIf="showDelayLabel('Delay'+message.ObjectID, message)">{{message.Delay}}</label>
</div>
<div class="col-md-2">
<label for="Variance{{message.ObjectID}}">+/-</label>
<input name="Variance{{message.ObjectID}}"
id="Variance{{message.ObjectID}}"
[(ngModel)]="message.Variance"
type="text" class="form-control">
</div>
<div class="col-md-2">
<label>Business Hours only</label>
<p-checkbox name="BusinessHoursOnly{{message.ObjectID}}"
[(ngModel)]="message.BusinessHoursOnly"
binary="true">
</p-checkbox>
</div>
<div class="col-md-4">
<label>Send</label>
<p-dropdown [options]="messageTemplates" filter="true"
optionLabel="TemplateName"
name="messageTemplate{{message.ObjectID}}"
[(ngModel)]="message.MessageTemplate"
(onChange)="showMessageTemplateDialog($event)"
[autoDisplayFirst]="false">
<ng-template let-message pTemplate="selectedItem">
<i class="{{getMessageClass(message.value)}}"></i>
<span
class="dropdown-text">{{message.label}}</span>
</ng-template>
<ng-template let-selectedMsg pTemplate="item">
<div class="ui-helper-clearfix"
style="position: relative;height: 25px;">
<i class="{{getMessageClass(selectedMsg.value)}}"></i>
<div
class="dropdown-text">{{selectedMsg.label}}</div>
</div>
</ng-template>
</p-dropdown>
</div>
<div class="col-md-2 text-center">
<button type="button" pButton label=" "
icon="ui-icon-settings"></button>
<button type="button" pButton label=" "
icon="ui-icon-close"
*ngIf="!message.IsWithdrawalMessage"
(click)="removeMessage(message, stage)"></button>
<div class="col-md-2">
<label>Business Hours only</label>
<p-checkbox name="BusinessHoursOnly{{message.ObjectID}}"
[(ngModel)]="message.BusinessHoursOnly"
binary="true">
</p-checkbox>
</div>
<div class="col-md-4">
<label>Send</label>
<p-dropdown [options]="messageTemplates" filter="true"
optionLabel="TemplateName"
name="messageTemplate{{message.ObjectID}}"
[(ngModel)]="message.MessageTemplate"
(onChange)="showMessageTemplateDialog($event, message)"
[autoDisplayFirst]="false">
<ng-template let-message pTemplate="selectedItem">
<i class="{{getMessageClass(message.value)}}"></i>
<span
class="dropdown-text">{{message.label}}</span>
</ng-template>
<ng-template let-selectedMsg pTemplate="item">
<div class="ui-helper-clearfix"
style="position: relative;height: 25px;">
<i class="{{getMessageClass(selectedMsg.value)}}"></i>
<div
class="dropdown-text">{{selectedMsg.label}}</div>
</div>
</div>
</div>
</p-panel>
<!-- End displaying messages -->
<hr/>
<div class="form-group row">
<div class="ui-g-12 ui-md-6">
<button class="btn btn-primary add-more-btn"
(click)="removeStage(stage)">Remove Stage
</button>
</div>
</ng-template>
</p-dropdown>
</div>
<div class="col-md-2 text-center">
<button type="button" pButton label=" " [disabled]="showLoader"
icon="ui-icon-settings"
(click)="configureMessageTemplate(message)"></button>
<button type="button" pButton label=" "
icon="ui-icon-close" [disabled]="showLoader"
*ngIf="!message.IsWithdrawalMessage"
(click)="removeMessage(message, stage)"></button>
</div>
</div>
<!-- End messaging section -->
</div>
</p-panel>
<!-- End displaying messages -->
<hr/>
<div class="form-group row">
<div class="ui-g-12 ui-md-6">
<button class="btn btn-primary add-more-btn" [disabled]="showLoader"
(click)="removeStage(stage)">Remove Stage
</button>
</div>
</div>
</div>
</ng-template>
</p-orderList>
<p-panel *ngFor="let stage of filteredStages(false, true)" toggler="header"
[toggleable]="true" [collapsed]="true">
<!-- End messaging section -->
</div>
</p-panel>
<!-- Start Post Stages -->
<p-panel *ngFor="let stage of filteredStages(false, true)" toggler="header" [toggleable]="true">
<p-header>
<span class="ui-panel-title" *ngIf="showStageLabel('StageName'+stage.ObjectID, stage)"
(click)="toggleStageInput($event, 'StageName'+stage.ObjectID, stage)">
......@@ -481,7 +490,7 @@
<label> Automatically progress to next stage </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.AutoProgress"
<p-inputSwitch [(ngModel)]="stage.AutoProgress" [disabled]="showLoader"
name="AutoProgress{{stage.ObjectID}}">
</p-inputSwitch>
</div>
......@@ -491,7 +500,7 @@
<label> Use messaging </label>
</div>
<div class="ui-g-12 ui-md-4">
<p-inputSwitch [(ngModel)]="stage.UseMessaging"
<p-inputSwitch [(ngModel)]="stage.UseMessaging" [disabled]="showLoader"
name="UseMessaging{{stage.ObjectID}}">
</p-inputSwitch>
</div>
......@@ -501,6 +510,7 @@
<div class="form-group row">
<div class="col-md-offset-9 col-md-3">
<button class="btn btn-primary add-more-btn" tabindex="11"
[disabled]="showLoader"
(click)="addMessage(stage)" *ngIf="stage.UseMessaging">Add
Message
</button>
......@@ -516,7 +526,7 @@
<label>After</label>
<p-inputMask name="Delay{{message.ObjectID}}"
class="form-control"
id="Delay{{message.ObjectID}}"
id="Delay{{message.ObjectID}}" [disabled]="showLoader"
[(ngModel)]="message.Delay"
characterPattern="[(\d+\:\d+\:\d+)|(\d+\:\d+)|(\d+)]"
*ngIf="showDelayInput('Delay'+message.ObjectID, message)"
......@@ -531,7 +541,7 @@
<label for="Variance{{message.ObjectID}}">+/-</label>
<input name="Variance{{message.ObjectID}}"
id="Variance{{message.ObjectID}}"
[(ngModel)]="message.Variance"
[(ngModel)]="message.Variance" [disabled]="showLoader"
type="text" class="form-control">
</div>
<div class="col-md-2">
......@@ -562,9 +572,10 @@
</p-dropdown>
</div>
<div class="col-md-2 text-center">
<button type="button" pButton label=" "
icon="ui-icon-settings"></button>
<button type="button" pButton label=" "
<button type="button" pButton label=" " [disabled]="showLoader"
icon="ui-icon-settings"
(click)="configureMessageTemplate(message)"></button>
<button type="button" pButton label=" " [disabled]="showLoader"
icon="ui-icon-close"
*ngIf="!message.IsWithdrawalMessage"
(click)="removeMessage(message, stage)"></button>
......@@ -579,12 +590,14 @@
<!-- End messaging section -->
</div>
</p-panel>
<!-- End Post Stages -->
</div>
</div>
<div class="ui-g form-group">
<div class="ui-g-12 ui-md-12">
<div class="text-center form-group">
<button type="button" value="Cancel" class="btn btn-primary largeBtn greyBtn"
[disabled]="showLoader"
routerLink="/admin/list-message-templates">Cancel
</button>
<button *ngIf="showSaveBtn()" type="button" value="Save" class="btn btn-primary largeBtn"
......
......@@ -51,8 +51,14 @@ p-inputMask {
&:hover {
background-color: transparent !important;
color: #4e5258 !important;
}
}
.ui-state-highlight {
background-color: transparent !important;
color: #4e5258 !important;
}
}
}
......
......@@ -2,10 +2,11 @@ import { Component, OnInit, ViewChild } from '@angular/core';
import { NgForm } from '@angular/forms';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { ConfirmationService } from 'primeng/api';
import { Dialog } from 'primeng/dialog';
import { combineLatest } from 'rxjs/observable/combineLatest';
import { Subscription } from 'rxjs/Subscription';
import { AppService } from '../../app.service';
import { SERVICES } from '../../constants';
import { ASSOCS, SERVICES } from '../../constants';
import { MessageTemplateModel } from '../../models/messageTemplate.model';
import { ResponseActionEnum } from '../../models/responseAction.enum';
import { StageTypeEnum } from '../../models/stageType.enum';
......@@ -29,6 +30,7 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
subscriptions: Array<Subscription> = [];
@ViewChild('form') form: NgForm;
@ViewChild('messageTemplateDialog') messageTemplateDialog: Dialog;
createdObjs;
updatedObjs;
deletedObjs;
......@@ -46,6 +48,8 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
showLoader = false;
editMode = false;
displayNewMessageTemplate = false;
selectedTemplateID = null;
selectedMessageTemplate = null; // object id of type WorkflowMessageModel
constructor(
private router: Router,
......@@ -327,7 +331,7 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
}
}
getMessageTemplates(): void {
getMessageTemplates(callback = null): void {
const sharedMsgParams = {
OnlyGlobalTemplate: true,
attribsByName: 'Autocomplete'
......@@ -347,10 +351,11 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
const myTemplates = response[0].filter(message => message.HiringTeam ===
this.adminPortalLayoutService.getHiringTeamID().ObjectID);
this.messageTemplates = [...myTemplates, ...response[1]];
const newTemplate = new MessageTemplateModel();
newTemplate.TemplateName = 'New Template';
newTemplate.id = '0';
this.messageTemplates.push(newTemplate);
this.addNewOptionToMessageTemplate();
if (callback) {
// called when a new message template is created
callback();
}
},
error => {
this.utilsService.handleError(error);
......@@ -359,11 +364,61 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
);
}
showMessageTemplateDialog($event): void {
addNewOptionToMessageTemplate(): void {
const newTemplate = new MessageTemplateModel();
newTemplate.TemplateName = 'New Template';
newTemplate.id = '0';
this.messageTemplates.push(newTemplate);
}
showMessageTemplateDialog($event, message: WorkflowMessageModel): void {
const template = $event.value;
if (template.id && template.id === '0') {
// When new template is selected, store it to global variable
this.selectedTemplateID = 'NEW';
this.displayNewMessageTemplate = true;
this.selectedMessageTemplate = message.ObjectID;
} else {
// When other options from message template are selected, assign global variable to null
this.selectedMessageTemplate = null;
}
}
configureMessageTemplate(message: WorkflowMessageModel): void {
if (message.MessageTemplate && typeof message.MessageTemplate !== 'string') {
this.selectedTemplateID = message.MessageTemplate.ObjectID;
this.displayNewMessageTemplate = true;
}
}
closeDialog(value): void {
if (value === -1) {
// Cancel button is clicked
} else if (this.selectedTemplateID === 'NEW' && this.selectedMessageTemplate !== null) {
// When new value is created, assign it to the current WorkFlowMessage
this.showLoader = true;
this.getMessageTemplates(() => {
const found = this.messageTemplates.find(elem => elem.ObjectID === value);
if (found) {
this.workflow.WorkFlowStages.forEach(wfStage => {
const messageTemplate = wfStage.WorkFlowMessages.find(wfMessage => wfMessage.ObjectID ===
this.selectedMessageTemplate);
if (messageTemplate) {
messageTemplate.MessageTemplate = found;
}
});
}
this.selectedMessageTemplate = null;
this.selectedTemplateID = null;
this.showLoader = false;
});
}
this.displayNewMessageTemplate = false;
}
populateMessageTemplates(template: MessageTemplateModel): void {
this.messageTemplates.splice(this.messageTemplates.length - 1, 1);
this.messageTemplates.push(template);
}
availableStepTypes(): Array<StepTypeEnum> {
......@@ -384,7 +439,7 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
}
stageMessagesCount(stage: WorkflowStageModel): string {
return `Message Schedule (${stage.WorkFlowMessages.length})`;
return `Message Schedule (${(stage && stage.WorkFlowMessages) ? stage.WorkFlowMessages.length : 0})`;
}
addStep($event, stage: WorkflowStageModel): void {
......@@ -494,11 +549,25 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
this.utilsService.resetCounter();
this.utilsService.clearErrorMessages();
this.subscriptions.push(this.editWorkflowTemplateService.getWorkflowTemplateByID(id, [])
const assoc = [ASSOCS.WORKFLOW_STAGE, [ASSOCS.WORKFLOW_STAGE, ASSOCS.WORKFLOW_MESSAGE].join('.'),
[ASSOCS.WORKFLOW_STAGE, ASSOCS.WORKFLOW_MESSAGE, ASSOCS.WORKFLOW_STEP].join('.')];
this.subscriptions.push(this.editWorkflowTemplateService.getWorkflowTemplateByID(id, assoc)
.subscribe(
data => {
this.workflow = data;
this.updatedObjs[this.workflow.ObjectID] = this.workflow;
this.utilsService.addObjsToJSONByObjectID(this.updatedObjs, this.workflow.WorkFlowStages);
this.workflow.WorkFlowStages.forEach(stage => {
if (stage.WorkFlowMessages) {
this.utilsService.addObjsToJSONByObjectID(this.updatedObjs, stage.WorkFlowMessages);
}
if (stage.Steps) {
this.utilsService.addObjsToJSONByObjectID(this.updatedObjs, stage.Steps);
}
});
this.reOrderStages(this.filterStages(true, true, true));
this.showLogs();
this.showLoader = false;
},
error => {
......@@ -544,7 +613,10 @@ export class EditWorkflowTemplateComponent extends BaseComponent implements OnIn
}
showLogs(): void {
console.log(this.workflow.WorkFlowStages);
console.log(this.workflow);
console.log(this.createdObjs);
console.log(this.updatedObjs);
console.log(this.deletedObjs);
}
alreadyExists(): boolean {
......
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { SERVICES } from "../../constants";
import { MessageTemplateModel } from "../../models/messageTemplate.model";
import { SERVICES } from '../../constants';
import { MessageTemplateModel } from '../../models/messageTemplate.model';
import { SearchService } from '../../oneit/services/search.service';
import { UtilsService } from '../../oneit/services/utils.service';
......@@ -21,25 +21,8 @@ export class EditWorkflowTemplateService {
);
}
getmessagetemplate_withdrawsForAutocomplete(searchTerm, assocs): Observable<any> {
return this.searchService.getObjects('', 'All', {}, assocs, null, null, null, null)
.map(
data =>
this.utilsService.convertResponseToObjects(data, assocs)
);
}
getmessagetemplatesForAutocomplete(searchTerm, assocs): Observable<any> {
return this.searchService.getObjects('', 'All', {}, assocs, null, null, null, null)
.map(
data => {
return this.utilsService.convertResponseToObjects(data, assocs);
}
);
}
getWorkflowTemplateByID(id, assocs): Observable<any> {
return this.searchService.getObjectById('', id, assocs)
return this.searchService.getObjectById('WorkFlowTemplates', id, assocs)
.map(
data => {
const objs = this.utilsService.convertResponseToObjects(data, assocs);
......
......@@ -21,3 +21,9 @@ export const SEARCH = {
MESSAGE_TEMPLATE: 'ListMessageTemplate',
WORKFLOW_TEMPLATE: 'ListWorkFlow'
};
export const ASSOCS = {
WORKFLOW_STAGE: 'WorkFlowStages',
WORKFLOW_MESSAGE: 'WorkFlowMessages',
WORKFLOW_STEP: 'WorkFlowSteps'
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment