This commit is contained in:
saravanakumarkandasami 2018-10-29 13:46:14 +05:30
commit 1ba4476104
37 changed files with 1924 additions and 12 deletions

View File

@ -25,7 +25,11 @@ export const AppRoutes: Routes = [{
},{
path:'template',
loadChildren:'./template/template.module#TemplateModule'
}
},
{
path:'quality_check_discussion',
loadChildren:'./quality-check/quality-check.module#QualityCheckModule'
},
]
}, {
path: '',

View File

@ -23,7 +23,7 @@
<ng-container matColumnDef="Status">
<mat-cell class="cell center" *matCellDef="let details;">
<span> {{details.pd_status}}</span><br>
<span class="fontsize">{{ (details.scheduled_on) ? (details.scheduled_on | slice:0:10):(details.scheduled_on) }}
<span class="fontsize">{{ (details.updatedon)? (details.updatedon | slice:0:10):(details.updatedon) }}
</span>
</mat-cell>
</ng-container>

View File

@ -23,8 +23,8 @@
<ng-container matColumnDef="Status">
<mat-cell class="cell center" *matCellDef="let details;">
<span> {{details.pd_status}}</span><br>
<span class="fontsize">{{ (details.scheduled_on)? (details.scheduled_on | slice:0:10):(details.scheduled_on) }}
</span>
<span class="fontsize">{{ (details.updatedon)? (details.updatedon | slice:0:10):(details.updatedon) }}
</span>
</mat-cell>
</ng-container>
<ng-container matColumnDef="Action">

View File

@ -0,0 +1,16 @@
.ic-change:hover {
transform: scale(1.1);
color: green;
}
.cell{
display:inline !important;
}
.cellhide{
display: none !important;
}
.center{
text-align:center;
}
.fontsize{
font-size:14px;
}

View File

@ -23,8 +23,8 @@
<ng-container matColumnDef="Status">
<mat-cell class="cell center" *matCellDef="let details;">
<span> {{details.pd_status}}</span><br>
<span class="fontsize">{{ (details.scheduled_on)? (details.scheduled_on | slice:0:10):(details.scheduled_on) }}
</span>
<span class="fontsize">{{ (details.updatedon)? (details.updatedon | slice:0:10):(details.updatedon) }}
</span>
</mat-cell>
</ng-container>
<ng-container matColumnDef="Action">

View File

@ -33,6 +33,12 @@
<app-completed-pd [bindFilterValue]="filterValue" (loadPdView)="viewPDDetails($event)"></app-completed-pd>
</mat-tab>
<mat-tab>
<ng-template mat-tab-label>QC Completed </ng-template>
<app-qc-completed-pd [bindFilterValue]="filterValue" (loadPdView)="viewPDDetails($event)"></app-qc-completed-pd>
</mat-tab>
</mat-tab-group>

View File

@ -7,6 +7,7 @@ import { AllPdComponent } from './all-pd/all-pd.component';
import { InprogressPdComponent } from './inprogress-pd/inprogress-pd.component';
import { ScheduledPdComponent } from './scheduled-pd/scheduled-pd.component';
import { CompletedPdComponent } from './completed-pd/completed-pd.component';
import { QcCompletedPdComponent } from './qc-completed-pd/qc-completed-pd.component';
@Component({
@ -33,7 +34,9 @@ export class ListPdComponent implements OnInit, OnDestroy {
@ViewChild(InprogressPdComponent) inprogressTabC: InprogressPdComponent;
@ViewChild(ScheduledPdComponent) scheduledTabC:ScheduledPdComponent;
@ViewChild(CompletedPdComponent) completedTabC: CompletedPdComponent;
@ViewChild(QcCompletedPdComponent) qcCompletedTabC: QcCompletedPdComponent;
constructor( notifier: NotifierService, private route: ActivatedRoute,
private router: Router, private _pd: PdTrigerService) {
this.notifier = notifier;
@ -68,7 +71,7 @@ export class ListPdComponent implements OnInit, OnDestroy {
}
pdListLoad(status: boolean){
this.viewPdList = status;
this.getTabIndex==0 ? this.allTabC.loadPDDetails() : this.getTabIndex==1 ? this.inprogressTabC.loadPDDetails() : this.getTabIndex==2 ? this.scheduledTabC.loadPDDetails() : this.completedTabC.loadPDDetails();
this.getTabIndex==0 ? this.allTabC.loadPDDetails() : this.getTabIndex==1 ? this.inprogressTabC.loadPDDetails() : this.getTabIndex==2 ? this.scheduledTabC.loadPDDetails() : this.qcCompletedTabC.loadPDDetails();
}
viewPDDetails(pdid:string){
@ -79,7 +82,8 @@ export class ListPdComponent implements OnInit, OnDestroy {
//get tab changes
onTabClick(event: MatTabChangeEvent) {
this.getTabIndex=event.index;
this.getTabIndex==0 ? this.allTabC.loadPDDetails() : this.getTabIndex==1 ? this.inprogressTabC.loadPDDetails() : this.getTabIndex==2 ? this.scheduledTabC.loadPDDetails() : this.completedTabC.loadPDDetails();
this.getTabIndex==0 ? this.allTabC.loadPDDetails() : this.getTabIndex==1 ? this.inprogressTabC.loadPDDetails() : this.getTabIndex==2 ? this.scheduledTabC.loadPDDetails() : this.qcCompletedTabC.loadPDDetails();
}
ngOnDestroy(): void {

View File

@ -0,0 +1,43 @@
<mat-card-content>
<mat-table [dataSource]="dataSourceTab5" matSort *ngIf="qcCompletedPdListData.length > 0" >
<ng-container matColumnDef="Name">
<mat-cell class="cell" *matCellDef="let details;">
<span *ngIf="details.applicat_details" mat-line><b>{{details.applicat_details[0].applicant_name}}</b></span><br>
<span class="fontsize"> {{details.lender_applicant_id}}</span> <span class="fontsize" *ngIf="details.customer_segment_abbr">-({{details.customer_segment_abbr}} )</span>
</mat-cell>
</ng-container>
<ng-container matColumnDef="Lenderid">
<mat-cell class="cell" *matCellDef="let details">
<span *ngIf="details.lender_full_name" mat-line> {{details.lender_full_name}} </span><br>
<span *ngIf="details.product_abbr" mat-line class="fontsize"> {{details.product_abbr}}/{{details.subproduct_abbr}}</span> <br>
<span *ngIf="details.loan_amount" class="fontsize"><i class="fa-1x fa fa-rupee"></i> {{details.loan_amount}}</span>
</mat-cell>
</ng-container>
<ng-container matColumnDef="Address">
<mat-cell class="cell" *matCellDef="let details;">
<span>{{details.pd_date_of_initiation}}</span><br>
<span class="fontsize" *ngIf="details.city_name"> <i class="fa-1x fa fa-map-marker"> </i> {{details.city_name}}-{{details.pincode}} </span>
</mat-cell>
</ng-container>
<ng-container matColumnDef="Status">
<mat-cell class="cell center" *matCellDef="let details;">
<span> {{details.pd_status}}</span><br>
<span class="fontsize">{{ (details.updatedon)? (details.updatedon | slice:0:10):(details.updatedon) }}
</span>
</mat-cell>
</ng-container>
<ng-container matColumnDef="Action">
<mat-cell class="cell center" *matCellDef="let details;">
<button mat-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" (click)="viewPD(details.pd_id)"><mat-icon>visibility</mat-icon></button>
</mat-cell>
</ng-container>
<mat-row style="align-items: normal !important;" *matRowDef="let row; columns: displayedColumns;">
</mat-row>
</mat-table>
</mat-card-content>
<mat-paginator *ngIf="!recordStatus" #paginator class="mat-elevation-z1" [length]="qcCompletedPdListData.length" [pageIndex]="pageIndex" [pageSize]="pageSize"
[pageSizeOptions]="[5, 10, 25,50, 100]" (page)="pageEvent = $event; pageChange($event)" showFirstLastButtons>
</mat-paginator>

View File

@ -0,0 +1,16 @@
.ic-change:hover {
transform: scale(1.1);
color: green;
}
.cell{
display:inline !important;
}
.cellhide{
display: none !important;
}
.center{
text-align:center;
}
.fontsize{
font-size:14px;
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { QcCompletedPdComponent } from './qc-completed-pd.component';
describe('QcCompletedPdComponent', () => {
let component: QcCompletedPdComponent;
let fixture: ComponentFixture<QcCompletedPdComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ QcCompletedPdComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(QcCompletedPdComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,86 @@
import { Component,ViewChild, OnInit, ViewEncapsulation, Input, Output, EventEmitter, OnDestroy, AfterViewInit, OnChanges, SimpleChanges } from '@angular/core';
import { PdTrigerService } from './../../../pd-service/pd-triger.service';
import { MatPaginator, MatSort, MatTableDataSource, PageEvent } from '@angular/material';
@Component({
selector: 'app-qc-completed-pd',
templateUrl: './qc-completed-pd.component.html',
styleUrls: ['./qc-completed-pd.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class QcCompletedPdComponent implements OnInit, OnChanges {
recordStatus: boolean;
errorMessage:any[]=[];
tabStatus:string="QC_COMPLETED";
public dataLengthTab5: number;
public dataSourceTab5 = new MatTableDataSource();
displayedColumns = ['Name','Lenderid','Address','Status','Action'];
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
@Input() bindFilterValue: string;
@Output() loadPdView = new EventEmitter<string>();
// data source variable details
qcCompletedPdListData:any[] = [];
// pagination variable details
length = 50;
pageIndex = 0;
pageSize = 10;
pageEvent: PageEvent;
constructor(private _pd: PdTrigerService) {
}
ngOnInit() {
this.recordStatus=false;
// this.loadPDDetails();
}
ngAfterViewInit() {
this.dataSourceTab5.paginator = this.paginator;
this.dataSourceTab5.sort = this.sort;
}
// get changes for filter from parent componnet filter
ngOnChanges(changes: SimpleChanges) {
let filteredText = changes.bindFilterValue.currentValue;
filteredText = filteredText ? filteredText.trim() : filteredText;
filteredText = filteredText ? filteredText.toLowerCase() : filteredText;
this.dataSourceTab5.filter = filteredText;
}
// load inprogress pd list
loadPDDetails() {
this._pd.getTabStatusPdDetails(this.tabStatus)
.subscribe(
data => {
if (data.status == 200) {
this.qcCompletedPdListData = data.records;
this.dataLengthTab5 = data.records.length;
this.dataSourceTab5.data = this.qcCompletedPdListData;
}
else{
this.qcCompletedPdListData=[];
this.dataLengthTab5= null;
this.recordStatus=true;
}
}, error => this.errorMessage = <any> error);
}
pageChange(e) {
console.log(e);
}
viewPD(pdid:string){
this.loadPdView.next(pdid);
}
}

View File

@ -23,7 +23,7 @@
<ng-container matColumnDef="Status">
<mat-cell class="cell center" *matCellDef="let details;">
<span> {{details.pd_status}}</span><br>
<span class="fontsize">{{ (details.scheduled_on)? (details.scheduled_on | slice:0:10):(details.scheduled_on) }}
<span class="fontsize">{{ (details.updatedon)? (details.updatedon | slice:0:10):(details.updatedon) }}
</span>
</mat-cell>
</ng-container>

View File

@ -406,7 +406,7 @@ optionsMapItems(items) {
// load pd view component
loadPdViewCompoent(){
this.router.navigate([ '../../../pdlist/viewpd',this.startPD], { relativeTo: this.route });
this.router.navigate([ '../../viewpd',this.startPD], { relativeTo: this.route });
}

View File

@ -140,7 +140,7 @@ export class ViewPdComponent implements OnInit, OnDestroy {
// start pd
getPDStart(pdID:any){
this.destroyType=3;
this.router.navigate([ '../../../pdlist/startpd',pdID], { relativeTo: this.route });
this.router.navigate([ '../../startpd',pdID], { relativeTo: this.route });
}
// updateViewComponent(editBack:string) {

View File

@ -39,6 +39,7 @@ import { InprogressPdComponent } from './list-pd/inprogress-pd/inprogress-pd.com
import { AllPdComponent } from './list-pd/all-pd/all-pd.component';
import { ScheduledPdComponent } from './list-pd/scheduled-pd/scheduled-pd.component';
import { CompletedPdComponent } from './list-pd/completed-pd/completed-pd.component';
import { QcCompletedPdComponent } from './list-pd/qc-completed-pd/qc-completed-pd.component';
/**
* Custom angular notifier options
*/
@ -108,7 +109,8 @@ const pdCustomNotifierOptions: NotifierOptions = {
AgmCoreModule.forRoot({apiKey: 'AIzaSyBtdO5k6CRntAMJCF-H5uZjTCoSGX95cdk'}),OwlDateTimeModule,
OwlNativeDateTimeModule,
],
declarations: [ListPdComponent, ManagePdComponent, MapPdViewComponent, AddPdComponent, ViewPdComponent, PdAllocationComponent, SmartPdAllocationComponent, SchedulePdComponent, EditPdApplicantComponent, EditPdMasterComponent, StartPdComponent, InprogressPdComponent, AllPdComponent, ScheduledPdComponent, CompletedPdComponent],
declarations: [ListPdComponent, ManagePdComponent, MapPdViewComponent, AddPdComponent, ViewPdComponent, PdAllocationComponent, SmartPdAllocationComponent, SchedulePdComponent, EditPdApplicantComponent, EditPdMasterComponent, StartPdComponent, InprogressPdComponent, AllPdComponent, ScheduledPdComponent, CompletedPdComponent, QcCompletedPdComponent],
exports: [PdAllocationComponent, SmartPdAllocationComponent, SchedulePdComponent, EditPdApplicantComponent, EditPdMasterComponent, StartPdComponent, CompletedPdComponent, QcCompletedPdComponent],
providers: [PdTrigerService, GetGeometricLocationService],
entryComponents: [PdAllocationComponent, SmartPdAllocationComponent, SchedulePdComponent, EditPdApplicantComponent, EditPdMasterComponent]
})

View File

@ -0,0 +1,31 @@
<mat-card>
<mat-card-content [style.display]="viewPdList ? 'block' : 'none'">
<div fxLayout="row">
<div fxFlex="50" class="pb-0 text-sm-left">
<mat-form-field dividerColor="primary" style="width: 50%;">
<input matInput [(ngModel)]="filterValue" placeholder="Filter">
</mat-form-field>
</div>
</div>
<mat-card>
<mat-tab-group (selectedTabChange)="onTabClick($event)">
<mat-tab>
<ng-template mat-tab-label>Completed </ng-template>
<app-completed-pd [bindFilterValue]="filterValue" (loadPdView)="viewPDDetails($event)"></app-completed-pd>
</mat-tab>
<mat-tab>
<ng-template mat-tab-label>QC Completed </ng-template>
<app-qc-completed-pd [bindFilterValue]="filterValue" (loadPdView)="viewPDDetails($event)"></app-qc-completed-pd>
</mat-tab>
</mat-tab-group>
</mat-card>
</mat-card-content>
</mat-card>
<notifier-container></notifier-container>
<router-outlet></router-outlet>

View File

@ -0,0 +1,16 @@
.ic-change:hover {
transform: scale(1.1);
color: green;
}
.cell{
display:inline !important;
}
.cellhide{
display: none !important;
}
.center{
text-align:center;
}
.fontsize{
font-size:14px;
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { QcListComponent } from './qc-list.component';
describe('QcListComponent', () => {
let component: QcListComponent;
let fixture: ComponentFixture<QcListComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ QcListComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(QcListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,71 @@
import { Component,ViewChild, OnInit, ViewEncapsulation, OnDestroy, OnChanges } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { NotifierService } from 'angular-notifier';
import { MatPaginator, MatSort, MatTableDataSource, PageEvent, MatTabChangeEvent } from '@angular/material';
import { CompletedPdComponent } from './../../personal-discussion/manage-pd/list-pd/completed-pd/completed-pd.component';
import { QcCompletedPdComponent } from './../../personal-discussion/manage-pd/list-pd/qc-completed-pd/qc-completed-pd.component';
@Component({
selector: 'app-qc-list',
templateUrl: './qc-list.component.html',
styleUrls: ['./qc-list.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class QcListComponent implements OnInit {
public filterValue: string;
private notifier: NotifierService;
recordStatus: boolean;
noRecordFound:boolean;
viewPdList:boolean;
viewMapPdList:boolean;
errorMessage: any;
public allTab:boolean;
public inprogressTab:boolean = false;
public scheduledTab:boolean = false;
public completedTab:boolean = false;
public getTabIndex:number=0;
@ViewChild(CompletedPdComponent) completedTabC: CompletedPdComponent;
@ViewChild(QcCompletedPdComponent) qcCompletedTabC: QcCompletedPdComponent;
constructor( notifier: NotifierService, private route: ActivatedRoute,
private router: Router) {
this.notifier = notifier;
}
ngOnInit() {
this.viewPdList = true;
this.recordStatus=false;
this.allTab=true;
}
// after view call all tabs component
ngAfterViewInit() {
this.completedTabC.loadPDDetails();
}
showListView(status: boolean){
this.viewPdList = status;
}
pdListLoad(status: boolean){
this.viewPdList = status;
this.getTabIndex==0 ? this.completedTabC.loadPDDetails() : this.qcCompletedTabC.loadPDDetails();
}
viewPDDetails(pdid:string){
this.viewPdList = !this.viewPdList;
this.router.navigate([ '../qclist/viewpd',pdid], { relativeTo: this.route });
}
//get tab changes
onTabClick(event: MatTabChangeEvent) {
this.getTabIndex=event.index;
this.getTabIndex==0 ? this.completedTabC.loadPDDetails() : this.qcCompletedTabC.loadPDDetails();
}
ngOnDestroy(): void {
this.viewPdList=false;
}
}

View File

@ -0,0 +1,365 @@
<mat-sidenav-container class="app-inner background-none shadow-none mail-db">
<mat-sidenav #mailnav [mode]="isOver() ? 'over' : 'side'" [opened]="!isOver()" class="mail-sidebar pl-xs pr-xs">
<button _ngcontent-c21="" class="compose-btn mat-warn mat-raised-button mb-1" (click)="changePDStatus(PDStatus);"> <span>QC Complete</span></button>
<mat-expansion-panel *ngFor="let category of categoryList;let catIndex = index; ">
<mat-expansion-panel-header>
<mat-panel-title class="text-xs-left">
<h6 class="mt-0"> {{category.category_name}}</h6>
</mat-panel-title>
</mat-expansion-panel-header>
<mat-list>
<mat-list-item class="custm-list-item" *ngFor="let questions of category.questions; let quesIndex=index" [ngStyle]="{'color':quesIndex === selectedQuestionIndex && catIndex === selectedCategoryIndex ? 'red' : 'black' }" (click)="OnSelectDirectQuestions(questions, catIndex,quesIndex)">
<small>{{ (questions.question.length>15)? (questions.question | slice:0:15)+'..':(questions.question) }}</small>
</mat-list-item>
</mat-list>
</mat-expansion-panel>
</mat-sidenav>
<mat-toolbar color="primary" fxHide="false" fxHide.gt-sm>
<button (click)="mailnav.toggle()" mat-icon-button>
<mat-icon>short_text</mat-icon>
</button>
<span class="mr-1 ml-1">Category</span>
</mat-toolbar>
<div class="main-content" fxFlex.xs="100" fxFlex.sm="100" fxFlex.md="100" fxFlex.lg="100" fxFlex.xl="100">
<figure>
<mat-card-content>
<div fxLayout="row" >
<button mat-raised-button mat-icon-button class="hover-icon start_close_btn" type="button" matTooltip="Close" matTooltipPosition="above"
(click)="loadPdViewCompoent()"><mat-icon>close</mat-icon></button>
<div fxFlex="33" class="text-xs-left">
<h4 class="mt-0">{{mainApplicantName}}</h4>
<small>{{pdMasterList.customer_segment_name}}</small>
</div>
<div fxFlex="66" class="text-xs-right">
<h4 class="mt-0">{{pdMasterList.product_name}}/{{pdMasterList.subproduct_name}}</h4>
<small>{{pdMasterList.lender_full_name}}/{{pdMasterList.lender_applicant_id}}</small>
</div>
</div>
</mat-card-content>
<hr>
<mat-card-content style="min-height: 240px;" *ngIf="selectedCategory.length==0">
<!-- <h6 class="mt-0">About</h6> -->
<p>No Records Found..</p>
</mat-card-content>
<!-- check type of questions -->
<ng-container [ngSwitch]="selectedCategory.fk_question_answertype">
<!-- start options type questions section -->
<ng-container *ngSwitchCase="1">
<form [formGroup]="optionsForm" *ngIf="answerList.length>0 ; else noanswers;">
<mat-card-content>
<h6 class="mt-0">{{optionsForm.controls.pd_question.value}}</h6>
<div fxLayout="row" >
<div fxFlex="60" class="text-xs-left">
<mat-list>
<mat-radio-group formControlName="modelValue">
<mat-list-item *ngFor="let option of optionsForm.controls.items.value">
<mat-radio-button [value]="option.pd_answer_id">{{option.pd_answer}}</mat-radio-button>
</mat-list-item>
</mat-radio-group>
</mat-list>
</div>
<div fxFlex="40" class="text-xs-right" *ngIf="optionsForm.controls.documents.length>0">
<mat-card >
<mat-card-content style="display: flex;
overflow: auto;min-height: 200px; max-height: 240px;">
<div fxLayout="row wrap">
<div fxFlex="50" class="m-gap p-gap" *ngFor="let docs of optionsForm.controls.documents.value; let docIndex=index">
<div class="p-list-main mb-2">
<div class="p-list">
<div class="top"><img [src]="docs.pd_document_url" alt=""/></div>
<div class="bottom">
<div class="left">
<div class="details">
<small>{{docs.pd_document_title}}</small>
<!-- <p>{{docs.pd_document_name}}</p> -->
</div>
<!-- <div class="buy"><i class="material-icons">add_shopping_cart</i></div> -->
</div>
</div>
</div>
</div>
</div>
</div>
</mat-card-content>
</mat-card>
</div>
</div>
</mat-card-content>
<mat-card-actions>
<div fxLayout="row" >
<div fxFlex="60" class="pb-0 text-sm-left">
<mat-form-field appearance="outline" style="width: 100%">
<mat-label>Remarks</mat-label>
<textarea matInput placeholder="Remarks" formControlName="pd_answer_remark"></textarea>
</mat-form-field>
</div>
<!-- this section for questions type options button actions -->
<div fxFlex="40" class="pb-0 text-sm-right">
<mat-button-toggle-group name="fontStyle" aria-label="Font Style">
<mat-button-toggle value="bold" matTooltip="Save&Previous" (click)="saveNextPrevious(optionsForm.controls,previous)" matTooltipPosition="below"><mat-icon>arrow_backward</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Previous" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_previous</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Next" (click)="skipNextPrevious(next)" matTooltipPosition="below"><mat-icon>skip_next</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Save&Next" (click)="saveNextPrevious(optionsForm.controls,next)" matTooltipPosition="below"><mat-icon>arrow_forward</mat-icon></mat-button-toggle>
</mat-button-toggle-group>
</div>
<!-- end questions type options -->
</div>
</mat-card-actions>
</form>
<ng-template #noanswers>
<mat-card-content>
<h6 class="mt-0">{{selectedCategory.question}}</h6>
</mat-card-content>
<mat-card-actions>
<div fxLayout="row" >
<div fxFlex="100" class="pb-0 text-sm-right">
<mat-button-toggle-group name="fontStyle" aria-label="Font Style">
<mat-button-toggle value="bold" matTooltip="Skip&Previous" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_previous</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Next" (click)="skipNextPrevious(next)" matTooltipPosition="below"><mat-icon>skip_next</mat-icon></mat-button-toggle>
</mat-button-toggle-group>
</div>
</div>
</mat-card-actions>
</ng-template>
</ng-container>
<!-- end options type questions section -->
<!-- start text box questions section -->
<ng-container *ngSwitchCase="2">
<form [formGroup]="textBoxForm" *ngIf="answerList.length>0 ; else noanswers;">
<mat-card-content>
<h6 class="mt-0">{{textBoxForm.controls.pd_question.value}}</h6>
<div fxLayout="row" >
<div fxFlex="60" class="text-xs-left">
<mat-list [formArrayName]="'items'">
<mat-list-item *ngFor="let control of textBoxForm.controls.items.controls; let i = index;" [formGroup]="control">
<mat-form-field appearance="outline" style="width: 100%">
<mat-label>Answers</mat-label>
<textarea matInput placeholder="Answers" formControlName="pd_answer"></textarea>
</mat-form-field>
</mat-list-item>
</mat-list>
</div>
<div fxFlex="40" class="text-xs-right" *ngIf="textBoxForm.controls.documents.length>0">
<mat-card >
<mat-card-content style="display: flex;
overflow: auto;min-height: 200px; max-height: 240px;">
<div fxLayout="row wrap">
<div fxFlex="50" class="m-gap p-gap" *ngFor="let docs of textBoxForm.controls.documents.value; let docIndex=index">
<div class="p-list-main mb-2">
<div class="p-list">
<div class="top"><img [src]="docs.pd_document_url" alt=""/></div>
<div class="bottom">
<div class="left">
<div class="details">
<small>{{docs.pd_document_title}}</small>
<!-- <p>{{docs.pd_document_name}}</p> -->
</div>
<!-- <div class="buy"><i class="material-icons">add_shopping_cart</i></div> -->
</div>
</div>
</div>
</div>
</div>
</div>
</mat-card-content>
</mat-card>
</div>
</div>
</mat-card-content>
<mat-card-actions>
<div fxLayout="row" >
<div fxFlex="60" class="pb-0 text-sm-left">
<mat-form-field appearance="outline" style="width: 100%">
<mat-label>Remarks</mat-label>
<textarea matInput placeholder="Remarks" formControlName="pd_answer_remark"></textarea>
</mat-form-field>
</div>
<!-- this section for questions type options button actions -->
<div fxFlex="40" class="pb-0 text-sm-right">
<mat-button-toggle-group name="fontStyle" aria-label="Font Style">
<mat-button-toggle value="bold" matTooltip="Save&Previous" (click)="saveNextPreviousText(textBoxForm.controls,previous)" matTooltipPosition="below"><mat-icon>arrow_backward</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Previous" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_previous</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Next" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_next</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Save&Next" (click)="saveNextPreviousText(textBoxForm.controls,next)" matTooltipPosition="below"><mat-icon>arrow_forward</mat-icon></mat-button-toggle>
</mat-button-toggle-group>
</div>
<!-- end questions type options -->
</div>
</mat-card-actions>
</form>
<ng-template #noanswers>
<mat-card-content>
<h6 class="mt-0">{{selectedCategory.question}}</h6>
</mat-card-content>
<mat-card-actions>
<div fxLayout="row" >
<div fxFlex="100" class="pb-0 text-sm-right">
<mat-button-toggle-group name="fontStyle" aria-label="Font Style">
<mat-button-toggle value="bold" matTooltip="Skip&Previous" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_previous</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Next" (click)="skipNextPrevious(next)" matTooltipPosition="below"><mat-icon>skip_next</mat-icon></mat-button-toggle>
</mat-button-toggle-group>
</div>
</div>
</mat-card-actions>
</ng-template>
</ng-container>
<!-- end text box questions section -->
<!-- start check box questions section -->
<ng-container *ngSwitchCase="3">
<form [formGroup]="checkBoxForm" *ngIf="answerList.length>0 ; else noanswers;">
<mat-card-content>
<h6 class="mt-0">{{checkBoxForm.controls.pd_question.value}}</h6>
<div fxLayout="row" >
<div fxFlex="60" class="text-xs-left">
<mat-list [formArrayName]="'items'">
<mat-list-item *ngFor="let control of checkBoxForm.controls.items.controls; let i = index;" [formGroup]="control">
<small><mat-checkbox class="example-margin" formControlName="checkbox" id="{{ control.controls.pd_answer_id.value }}"> {{ control.controls.pd_answer.value }}</mat-checkbox> </small>
</mat-list-item>
</mat-list>
</div>
<div fxFlex="40" class="text-xs-right" *ngIf="checkBoxForm.controls.documents.length>0">
<mat-card >
<mat-card-content style="display: flex;
overflow: auto;min-height: 200px; max-height: 240px;">
<div fxLayout="row wrap">
<div fxFlex="50" class="m-gap p-gap" *ngFor="let docs of textBoxForm.controls.documents.value; let docIndex=index">
<div class="p-list-main mb-2">
<div class="p-list">
<div class="top"><img [src]="docs.pd_document_url" alt=""/></div>
<div class="bottom">
<div class="left">
<div class="details">
<small>{{docs.pd_document_title}}</small>
<!-- <p>{{docs.pd_document_name}}</p> -->
</div>
<!-- <div class="buy"><i class="material-icons">add_shopping_cart</i></div> -->
</div>
</div>
</div>
</div>
</div>
</div>
</mat-card-content>
</mat-card>
</div>
</div>
</mat-card-content>
<mat-card-actions *ngIf="checkBoxForm.controls.items.length > 0">
<div fxLayout="row" >
<div fxFlex="60" class="pb-0 text-sm-left">
<mat-form-field appearance="outline" style="width: 100%">
<mat-label>Remarks</mat-label>
<textarea matInput placeholder="Remarks" formControlName="pd_answer_remark"></textarea>
</mat-form-field>
</div>
<!-- this section for questions type options button actions -->
<div fxFlex="40" class="pb-0 text-sm-right">
<mat-button-toggle-group name="fontStyle" aria-label="Font Style">
<mat-button-toggle value="bold" matTooltip="Save&Previous" (click)="saveNextPrevious(checkBoxForm.controls,previous)" matTooltipPosition="below"><mat-icon>arrow_backward</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Previous" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_previous</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Next" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_next</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Save&Next" (click)="saveNextPrevious(checkBoxForm.controls,next)" matTooltipPosition="below"><mat-icon>arrow_forward</mat-icon></mat-button-toggle>
</mat-button-toggle-group>
</div>
<!-- end questions type options -->
</div>
</mat-card-actions>
</form>
<ng-template #noanswers>
<mat-card-content>
<h6 class="mt-0">{{selectedCategory.question}}</h6>
</mat-card-content>
<mat-card-actions>
<div fxLayout="row" >
<div fxFlex="100" class="pb-0 text-sm-right">
<mat-button-toggle-group name="fontStyle" aria-label="Font Style">
<mat-button-toggle value="bold" matTooltip="Skip&Previous" (click)="skipNextPrevious(previous)" matTooltipPosition="below"><mat-icon>skip_previous</mat-icon></mat-button-toggle>
<mat-button-toggle value="bold" matTooltip="Skip&Next" (click)="skipNextPrevious(next)" matTooltipPosition="below"><mat-icon>skip_next</mat-icon></mat-button-toggle>
</mat-button-toggle-group>
</div>
</div>
</mat-card-actions>
</ng-template>
</ng-container>
</ng-container>
<!-- end check box questions section -->
</figure>
</div>
</mat-sidenav-container>
<notifier-container></notifier-container>

View File

@ -0,0 +1,121 @@
@import "./../../../../assets/styles/scss/components/messages";
:host {
margin-left: -5px;
margin-right: -5px;
margin-top: -5px;
display: block;
}
:host /deep/ {
mat-sidenav {
width: 250px;
}
.mat-sidenav-content {
padding: 0;
}
@media (min-width: 959px) {
.mat-sidenav-side {
background-color: transparent;
box-shadow: none!important;
}
}
}
.mat-expansion-panel-header-description {
color: rgba(0, 0, 0, 87);
}
.mat-card-content {
background-color: white;
}
.mat-card-actions {
background-color: white;
}
.text-ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.custm-list-item {
cursor: pointer;
}
$base-card-box-shadow:1.5px 2.6px 24px 0 rgba(0, 35, 136, 0.08) !important;
$product-bg-color-hover: rgba(103, 58, 183, 0.7);
.p-list-main {
background: white;
margin: auto;
position: relative;
overflow: hidden !important;
border-radius: 10px 10px 10px 10px;
box-shadow: $base-card-box-shadow;
transform: scale(0.95);
transition: box-shadow 0.5s, transform 0.5s;
&:hover {
transform: scale(1);
box-shadow: 5px 20px 30px rgba(0, 0, 0, 0.2);
}
.p-list {
position: relative;
.top {
height: 100%;
width: 100%;
// background: url(https://s-media-cache-ak0.pinimg.com/736x/49/80/6f/49806f3f1c7483093855ebca1b8ae2c4.jpg) no-repeat center center;
-webkit-background-size: 100%;
-moz-background-size: 100%;
-o-background-size: 100%;
background-size: 100%;
}
.bottom {
width: 200%;
height: 15%;
transition: transform 0.5s;
h1 {
margin: 0;
padding: 0;
}
p {
margin: 0;
padding: 0;
}
.left {
height: 100%;
width: 50%;
background: #f4f4f4;
position: relative;
float: left;
.details {
padding: 5px;
float: left;
// width: calc(70% - 40px);
}
}
.right {
width: 50%;
background: #A6CDDE;
color: white;
float: right;
height: 200%;
overflow: hidden;
.details {
padding: 20px;
float: right;
width: calc(70% - 40px);
}
}
}
}
}
.start_close_btn {
position: fixed;
right: 69px;
top: 112px;
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { QcStartComponent } from './qc-start.component';
describe('QcStartComponent', () => {
let component: QcStartComponent;
let fixture: ComponentFixture<QcStartComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ QcStartComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(QcStartComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,415 @@
import { Component, ViewChild ,OnInit,ViewEncapsulation, OnDestroy } from '@angular/core';
import { FormBuilder, FormGroup, Validators, FormControl, FormArray } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { NotifierService } from 'angular-notifier';
import { QcListComponent } from './../qc-list.component';
import { QcService } from './../../qc-service/qc.service';
@Component({
selector: 'app-qc-start',
templateUrl: './qc-start.component.html',
styleUrls: ['./qc-start.component.scss']
})
export class QcStartComponent implements OnInit, OnDestroy {
private notifier: NotifierService;
public startPD:string;
public PDStatus: string;
public mainApplicantName:string;
//public remarks: string;
errorMessage:any;
selectedCategory:any=[];
categoryList: any=[];
pdMasterList: any=[];
optionsForm: FormGroup;
checkBoxForm:FormGroup;
textBoxForm:FormGroup;
next:number;
previous:number;
selectedCategoryIndex:number;
selectedQuestionIndex:number;
getQuestionsLength:number;
answerList:any=[];
ansPDList:any=[];
constructor(notifier: NotifierService, private fb: FormBuilder,private route: ActivatedRoute,
private router: Router,
private QcListComponent : QcListComponent, private _qc: QcService,) {
this.startPD = this.route.snapshot.params['pdid'];
this.notifier = notifier;
}
ngOnInit() {
this.QcListComponent.showListView(false);
const elemSidebar = <HTMLElement>document.querySelector('.app-inner .mail-sidebar');
const elemContent = <HTMLElement>document.querySelector('.app-inner .main-content');
if (window.matchMedia(`(min-width: 960px)`).matches && !this.isMac()) {
// Ps.initialize(elemSidebar, { wheelSpeed: 2, suppressScrollX: true });
// Ps.initialize(elemContent, { wheelSpeed: 2, suppressScrollX: true });
}
this.loadTemplates(this.startPD);
this.next=1;
this.previous=2;
this.PDStatus="QC_COMPLETED"
}
isMac(): boolean {
let bool = false;
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.platform.toUpperCase().indexOf('IPAD') >= 0) {
bool = true;
}
return bool;
}
// load pd template details
loadTemplates(startID:string){
this._qc.loadPDTemplates(startID).subscribe(
data => {
if (data.status == 200) {
this.pdMasterList=data.records.pdmaster_details;
this.categoryList=data.records.question_answers;
let filterApplicantName= data.records.pdapplicants_detials.filter(item => item.applicant_type == 1);
this.mainApplicantName = filterApplicantName[0].applicant_name;
}
else{
this.pdMasterList="";
this.mainApplicantName="";
this.categoryList=[];
}
}, error => this.errorMessage = <any> error);
}
ngOnDestroy(): void {
this.QcListComponent.showListView(true);
}
isOver(): boolean {
return window.matchMedia(`(max-width: 960px)`).matches;
}
OnSelectDirectQuestions(selectedQuestions: any, categoryIndex:number,questionsIndex:number){
this.selectedCategory=selectedQuestions;
this.selectedCategoryIndex=categoryIndex;
this.selectedQuestionIndex=questionsIndex;
let serachQuestions = {
"question_id":selectedQuestions.fk_question_id,
"pd_id":this.startPD,
"template_id":selectedQuestions.fk_template_id,
"category_id":selectedQuestions.fk_template_question_category_id
}
this.getAnswers(serachQuestions);
}
// load question based answer list
getAnswers(serachList:any){
this._qc.getAnswersForPD(serachList).subscribe(
data => {
if (data.status == 200) {
this.answerList=data.records.answers;
this.ansPDList=data.records;
// this for options type questions
if(this.selectedCategory.fk_question_answertype==1){
this.loadOtionsForm(this.selectedCategory, this.answerList);
}
//this for text box type questions
else if(this.selectedCategory.fk_question_answertype==2){
this.loadTextBoxForm(this.selectedCategory,this.answerList);
}
//this for check box type questions
else if(this.selectedCategory.fk_question_answertype==3){
this.loadCheckBoxForm(this.selectedCategory,this.answerList);
}
}
}, error => this.errorMessage = <any> error);
}
// load check box form
loadCheckBoxForm(selectedCategory: any, ansItem: any){
// create checkbox group
let checkboxGroup = new FormArray(ansItem.map(item => new FormGroup({
fk_pd_id:new FormControl(this.startPD),
pd_detail_answer_id: new FormControl(item.pd_detail_answer_id),
pd_answer_id: new FormControl(item.question_answer_id),
pd_answer: new FormControl(item.answer),
pd_answer_weightage:new FormControl(item.template_answer_weightage),
checkbox: new FormControl(item.isactive==null ? false: true)
})));
// create documents group
let documentsGroup = new FormArray(this.ansPDList.images.map(item => new FormGroup({
pd_document_title:new FormControl(item.pd_document_title),
pd_document_url: new FormControl(item.pd_document_name),
})));
// create a hidden reuired formControl to keep status of checkbox group
let hiddenControl = new FormControl(this.mapItems(checkboxGroup.value), Validators.required);
// update checkbox group's value to hidden formcontrol
checkboxGroup.valueChanges.subscribe((v) => {
hiddenControl.setValue(this.mapItems(v));
});
this.checkBoxForm = new FormGroup({
pd_detail_id: new FormControl(this.ansPDList.pd_detail_id),
fk_pd_id: new FormControl(this.startPD),
fk_category_id: new FormControl(this.selectedCategory.fk_template_question_category_id),
fk_question_id: new FormControl(this.selectedCategory.fk_question_id),
pd_question: new FormControl(this.selectedCategory.question),
pd_question_weightage: new FormControl(this.selectedCategory.question_weightage),
pd_answer_remark:new FormControl(this.ansPDList.question_remark),
items: checkboxGroup,
selectedItems: hiddenControl,
documents: documentsGroup
});
}
// map options form group values
mapItems(items) {
let selectedItems = items.filter((item) => item.checkbox).map((item) => item);
return selectedItems.length ? selectedItems : null;
}
// load Options form
loadOtionsForm(selectedCategory: any, ansItem: any){
// create options type group
let optionsGroup = new FormArray(ansItem.map(item => new FormGroup({
fk_pd_id:new FormControl(this.startPD),
pd_detail_answer_id: new FormControl(item.pd_detail_answer_id),
pd_answer_id: new FormControl(item.question_answer_id),
pd_answer: new FormControl(item.answer),
pd_answer_weightage:new FormControl(item.template_answer_weightage),
options: new FormControl(item.isactive==null ? false: true)
})));
// create documents group
let documentsGroup = new FormArray(this.ansPDList.images.map(item => new FormGroup({
pd_document_title:new FormControl(item.pd_document_title),
pd_document_url: new FormControl(item.pd_document_name),
})));
// create a hidden reuired formControl to keep status of checkbox group
let hiddenControl = new FormControl(this.optionsMapItems(optionsGroup.value), Validators.required);
let checkedItem = hiddenControl.value!=null ? new FormControl(hiddenControl.value[0].pd_answer_id) :new FormControl(null);
this.optionsForm = new FormGroup({
pd_detail_id: new FormControl(this.ansPDList.pd_detail_id),
fk_pd_id: new FormControl(this.startPD),
fk_category_id: new FormControl(this.selectedCategory.fk_template_question_category_id),
fk_question_id: new FormControl(this.selectedCategory.fk_question_id),
pd_question: new FormControl(this.selectedCategory.question),
pd_question_weightage: new FormControl(this.selectedCategory.question_weightage),
pd_answer_remark:new FormControl(this.ansPDList.question_remark),
items: optionsGroup,
selectedItems: hiddenControl,
modelValue : checkedItem,
documents: documentsGroup
});
this.optionsForm.controls.modelValue.valueChanges.subscribe((v) => {
hiddenControl.setValue(this.updateOptionsMapItems(v,optionsGroup.value));
});
}
// map option type group values
optionsMapItems(items) {
let optionSelectedItems = items.filter((item) => item.options==true).map((item) => item);
return optionSelectedItems.length ? optionSelectedItems : null;
}
// map options type while change options
updateOptionsMapItems(key,items) {
let updateSelectedItems = items.filter((item) => item.pd_answer_id==key).map((item) => item);
return updateSelectedItems.length ? updateSelectedItems : null;
}
// load text box form
loadTextBoxForm(selectedCategory: any, ansItem: any){
// create text box type group
let textGroup = new FormArray(ansItem.map(item => new FormGroup({
fk_pd_id:new FormControl(this.startPD),
pd_detail_answer_id: new FormControl(item.pd_detail_answer_id),
pd_answer_id: new FormControl(item.question_answer_id),
pd_answer: new FormControl(item.answer),
pd_answer_weightage:new FormControl(item.template_answer_weightage),
text: new FormControl(item.pd_detail_answer_id==null ? false: true)
})));
// create documents group
let documentsGroup = new FormArray(this.ansPDList.images.map(item => new FormGroup({
pd_document_title:new FormControl(item.pd_document_title),
pd_document_url: new FormControl(item.pd_document_name),
})));
this.textBoxForm = new FormGroup({
pd_detail_id: new FormControl(ansItem.pd_detail_id),
fk_pd_id: new FormControl(this.startPD),
fk_category_id: new FormControl(this.selectedCategory.fk_template_question_category_id),
fk_question_id: new FormControl(this.selectedCategory.fk_question_id),
pd_question: new FormControl(this.selectedCategory.question),
pd_question_weightage: new FormControl(this.selectedCategory.question_weightage),
pd_answer_remark:new FormControl(this.ansPDList.question_remark),
items: textGroup,
documents: documentsGroup
});
}
// next save and previous save for options and check box type questions
saveNextPrevious(details:any, type:number){
let fetchAns =[];
details.selectedItems.value.forEach((itemElement, itemIndex) => {
let obj1 = {
fk_pd_detail_id:details.pd_detail_id.value,
fk_pd_id:itemElement.fk_pd_id,
pd_detail_answer_id: itemElement.pd_detail_answer_id,
pd_answer_id: itemElement.pd_answer_id,
pd_answer: itemElement.pd_answer,
pd_answer_weightage:itemElement.pd_answer_weightage,
}
fetchAns.push(obj1)
});
let pd_details:any=[{
"pd_detail_id":details.pd_detail_id.value,
"fk_pd_id":details.fk_pd_id.value,
"fk_category_id":details.fk_category_id.value,
"fk_question_id":details.fk_question_id.value,
"pd_question":details.pd_question.value,
"pd_question_weightage":details.pd_question_weightage.value,
"question_remark":details.pd_answer_remark.value,
"answers":fetchAns,
"images":[]
}];
this._qc.savePDQuestions(pd_details).subscribe(result => {
if (result.status == 200) {
if(type==1){
this.skipNextPrevious(this.next);
}
else{
this.skipNextPrevious(this.previous);
}
}
}, error => {
});
}
// next save and previous save for text type questions
saveNextPreviousText(details:any, type:number){
let fetchAns =[];
details.items.value.forEach((itemElement, itemIndex) => {
let obj1 = {
fk_pd_detail_id:details.pd_detail_id.value,
fk_pd_id:itemElement.fk_pd_id,
pd_detail_answer_id: itemElement.pd_detail_answer_id,
pd_answer_id: itemElement.pd_answer_id,
pd_answer: itemElement.pd_answer,
pd_answer_weightage:itemElement.pd_answer_weightage,
}
fetchAns.push(obj1)
});
let pd_details:any={
"pd_detail_id":details.pd_detail_id.value,
"fk_pd_id":details.fk_pd_id.value,
"fk_category_id":details.fk_category_id.value,
"fk_question_id":details.fk_question_id.value,
"pd_question":details.pd_question.value,
"pd_question_weightage":details.pd_question_weightage.value,
"question_remark":details.pd_answer_remark.value,
"answers":fetchAns,
"images":[]
};
this._qc.savePDQuestions(pd_details).subscribe(result => {
if (result.status == 200) {
if(type==1){
this.skipNextPrevious(this.next);
}
else{
this.skipNextPrevious(this.previous);
}
}
}, error => {
});
}
// skip to previous and next questions
skipNextPrevious(type:number){
// for skip to next
if(type==1){
if(this.categoryList.length > this.selectedCategoryIndex ){
let nextCatList = this.categoryList[this.selectedCategoryIndex];
this.selectedQuestionIndex=this.selectedQuestionIndex < nextCatList.questions.length-1 ? this.selectedQuestionIndex+1 : this.selectedQuestionIndex;
let nextQuesList = nextCatList.questions[this.selectedQuestionIndex];
this.selectedCategory=nextQuesList;
this.selectedCategoryIndex=this.selectedCategoryIndex;
this.selectedQuestionIndex=this.selectedQuestionIndex;
let serachQuestions = {
"question_id":nextQuesList.fk_question_id,
"pd_id":this.startPD,
"template_id":nextQuesList.fk_template_id,
"category_id":nextQuesList.fk_template_question_category_id
}
this.getAnswers(serachQuestions);
}
}
// for skip to previous
else if(type==2){
if(this.categoryList.length > this.selectedCategoryIndex ){
let preCatList = this.categoryList[this.selectedCategoryIndex];
this.selectedQuestionIndex=this.selectedQuestionIndex ==0 ? this.selectedQuestionIndex : this.selectedQuestionIndex-1;
let preQuesList = preCatList.questions[this.selectedQuestionIndex];
this.selectedCategory=preQuesList;
this.selectedCategoryIndex=this.selectedCategoryIndex;
this.selectedQuestionIndex=this.selectedQuestionIndex;
let serachQuestions = {
"question_id":preQuesList.fk_question_id,
"pd_id":this.startPD,
"template_id":preQuesList.fk_template_id,
"category_id":preQuesList.fk_template_question_category_id
}
this.getAnswers(serachQuestions);
}
}
}
//change pd status
changePDStatus(status:string){
let update_array = {
"pd_id": this.startPD
}
this._qc.editPdMasterDetails(update_array, status).subscribe(result => {
if (result.status == 200) {
this.notifier.notify('success', 'QC Completed.');
}
else {
this.notifier.notify('warning', 'Something Wents Wrong Try Again.!');
}
}, error => {
this.notifier.notify('warning', 'Something Wents Wrong Try Again.!');
});
}
// load pd view component
loadPdViewCompoent(){
this.router.navigate([ '../../viewpd',this.startPD], { relativeTo: this.route });
}
}

View File

@ -0,0 +1,140 @@
<div class="mb-2" >
<div fxLayout="row" fxLayoutAlign="start center" class="filter-header">
<div *ngFor="let master of pdMasterData" class="ml-xs mr-xs" fxFlex="75">
<h4>{{master.lender_full_name}} - {{master.lender_applicant_id}}</h4>
{{master.pd_date_of_initiation}}
</div>
<div *ngFor="let master of pdMasterData" class="ml-xs mr-xs pt-1" fxFlex="25" style="text-align:right;" >
<button *ngIf="master.pd_type_name" mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Allocate" matTooltipPosition="above" (click)="pdAllocationTo(master)"><mat-icon>verified_user</mat-icon></button>
<button *ngIf="master.pd_type_name" mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Schedule" matTooltipPosition="above" (click)="scheduleDetails(master)"><mat-icon>schedule</mat-icon></button>
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Discussion" matTooltipPosition="above" (click)="getPDStart(viewID)"><mat-icon>question_answer</mat-icon></button>
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Close" matTooltipPosition="above" (click)="loadPdListCompoent()"><mat-icon>close</mat-icon></button>
<br><span style="color:red;text-align:center">{{master.pd_allocated_to}} -{{master.pd_status_name}}</span>
</div>
</div>
<mat-card-content>
<div fxLayout="row wrap">
<div class="m-gap p-gap" fxFlex.xs="100" fxFlex.sm="100" fxFlex.md="50" fxFlex.lg="50" fxFlex.xl="50">
<!--pd master -->
<mat-card *ngFor="let master of pdMasterData" class="minheight">
<div class="cardEdit">
<!-- <button *ngIf="master.pd_type_name" mat-raised-button mat-button-sm mat-icon-button class="mr-1 mb-1 hover-icon" type="button" (click)="pdAllocationTo(master)"><mat-icon>directions_run</mat-icon></button>
<button *ngIf="master.pd_type_name" mat-raised-button mat-button-sm mat-icon-button class="mr-1 mb-1 hover-icon" type="button" (click)="scheduleDetails(master)"><mat-icon>schedule</mat-icon></button>
-->
<button mat-raised-button mat-button-sm mat-icon-button class="mr-1 mb-1 hover-icon" type="button" (click)="editPdMaster(master)"><mat-icon>edit</mat-icon></button>
</div>
<mat-card-header>
<!-- <img mat-card-avatar src="assets/images/avatar.jpg">
<mat-card-title>{{master.lender_full_name}} - {{master.lender_applicant_id}}
</mat-card-title>-->
<mat-card-subtitle *ngIf="master.city_name" class="hover-icon"><i class="fa-1x fa fa-map-marker"> </i> &nbsp;<span>{{master.city_name}} / {{master.state_name}}-{{master.pincode}}</span></mat-card-subtitle>
</mat-card-header>
<mat-card-content>
<p *ngIf="master.product_name">{{master.product_name}} / {{master.subproduct_name}}</p>
<p *ngIf="master.pd_type_name"><span>{{master.pd_type_name}}</span> / <span *ngIf="master.loan_amount" class="hover-icon"><i class="fa-1x fa fa-rupee">&nbsp;</i>{{master.loan_amount}}</span></p>
<p><span>{{master.addressline1}},{{master.addressline2}} ,{{master.addressline3}}</span></p>
</mat-card-content>
</mat-card>
</div>
<div fxFlex.xs="100" class="m-gap p-gap" fxFlex.sm="100" fxFlex.md="50" fxFlex.lg="50" fxFlex.xl="50">
<!-- applicant card -->
<mat-card class="minheight">
<div class="cardEdit">
<button mat-raised-button mat-button-sm mat-icon-button class="mr-1 mb-1 hover-icon" type="button" (click)="editPdApplicant(pdApplicantData)"><mat-icon>edit</mat-icon></button>
</div>
<mat-card-header>
<mat-card-title>Applicants</mat-card-title>
</mat-card-header>
<mat-card-content *ngIf="pdApplicantData.length>0; else noApplicant">
<mat-list *ngFor="let applicant of pdApplicantData">
<mat-list-item>
<p><span *ngIf="applicant.applicant_name!=null" class="mb-2 text-center hover-icon">
<i class="fa-1x fa fa-user-o"></i>
&nbsp;{{applicant.applicant_name}} </span> &nbsp;&nbsp;&nbsp;<span *ngIf="applicant.mobile_no!=null" class="mb-2 text-center hover-icon">
<i class="fa-1x fa fa-phone"></i>
&nbsp;{{applicant.mobile_no}} </span> <br><span *ngIf="applicant.applicant_type=='1';else codetails" style="font-size:12px;">Main Applicant</span>
<ng-template #codetails>&nbsp;&nbsp;&nbsp;<span>{{applicant.relation_name}}</span></ng-template>
</p>
</mat-list-item>
</mat-list>
</mat-card-content>
<ng-template #noApplicant><mat-card-content><p>No Applicant</p></mat-card-content></ng-template>
</mat-card>
</div>
<div fxFlex.xs="100" fxFlex.sm="100" fxFlex.md="50" fxFlex.lg="50" fxFlex.xl="50" class="m-gap p-gap">
<!-- pd documents card -->
<mat-card class="minheight">
<!-- <div class="cardEdit">
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon"><mat-icon>edit</mat-icon></button>
</div> -->
<mat-card-header>
<mat-card-title>Documents</mat-card-title>
<!-- <mat-card-subtitle><i class="fa-1x fa fa-map-marker"> </i> &nbsp;{{master.city_name}} / {{master.state_name}}-{{master.pincode}}</mat-card-subtitle> -->
</mat-card-header>
<mat-card-content *ngIf="pdDocumentsData.length>0; else nodocument">
<mat-list *ngFor="let documents of pdDocumentsData">
<mat-list-item>
<p><span>
{{documents.pd_document_title}} </span> &nbsp;&nbsp;&nbsp;<span class="mb-2 text-center hover-icon">
<i class="fa-1x fa fa-file"></i>
&nbsp;{{documents.pd_document_name}} </span>
</p>
</mat-list-item>
</mat-list>
</mat-card-content>
<ng-template #nodocument><mat-card-content><p>No Document</p></mat-card-content></ng-template>
</mat-card>
</div>
<div class="m-gap p-gap" fxFlex.xs="100" fxFlex.sm="100" fxFlex.md="100" fxFlex.lg="100" fxFlex.xl="100">
<!--pd logs card -->
<mat-expansion-panel *ngIf="masterPdLogsData.length>0; else nohistory">
<mat-expansion-panel-header>
<mat-panel-title class="text-xs-left">
<h6 class="mt-0"> PD History</h6>
</mat-panel-title>
</mat-expansion-panel-header>
<mat-list class="m-gap p-gap" *ngFor="let masterHistory of masterPdLogsData">
<mat-list-item>
<p>{{masterHistory}}</p>
</mat-list-item>
</mat-list>
</mat-expansion-panel>
<ng-template #nohistory>
<mat-card>
<mat-card-content><p>No History</p></mat-card-content>
</mat-card>
</ng-template>
</div>
</div>
</mat-card-content>
</div>
<!-- <notifier-container></notifier-container> -->

View File

@ -0,0 +1,6 @@
.cardEdit {
display: inline;float:right;padding-top:3%;
}
.minheight {
min-height: 100%;
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { QcViewComponent } from './qc-view.component';
describe('QcViewComponent', () => {
let component: QcViewComponent;
let fixture: ComponentFixture<QcViewComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ QcViewComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(QcViewComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,151 @@
import { Component, OnInit,ViewEncapsulation, EventEmitter, Input, Output, OnDestroy } from '@angular/core';
import { FormBuilder, FormGroup, Validators, FormControl, FormArray } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { MatDialog } from '@angular/material';
import { NotifierService } from 'angular-notifier';
import { QcService } from './../../qc-service/qc.service';
import { QcListComponent } from './../qc-list.component';
import { PdAllocationComponent } from './../../../personal-discussion/manage-pd/list-pd/pd-allocation/pd-allocation.component';
import { SmartPdAllocationComponent } from './../../../personal-discussion/manage-pd/list-pd/smart-pd-allocation/smart-pd-allocation.component';
import { SchedulePdComponent } from './../../../personal-discussion/manage-pd/list-pd/schedule-pd/schedule-pd.component';
import { EditPdApplicantComponent } from './../../../personal-discussion/manage-pd/list-pd/edit-pd-applicant/edit-pd-applicant.component';
import { EditPdMasterComponent } from './../../../personal-discussion/manage-pd/list-pd/edit-pd-master/edit-pd-master.component';
@Component({
selector: 'app-qc-view',
templateUrl: './qc-view.component.html',
styleUrls: ['./qc-view.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class QcViewComponent implements OnInit, OnDestroy {
public selectedMoment = new Date();
private notifier:NotifierService;
errorMessage: any;
pdMasterData: any=[];
pdApplicantData: any=[];
pdDocumentsData: any=[];
masterPdLogsData: any=[];
applicantPDLogsData: any=[];
viewID:string;
viewParams:any;
destroyType:number=1;
public _EditPDtriggerForm:FormGroup;
constructor(notifier:NotifierService,private dialog: MatDialog,private _fb: FormBuilder,
private _qc: QcService,private route: ActivatedRoute,private router: Router, private QcListComponent: QcListComponent) {
this.notifier=notifier
}
ngOnInit() {
this.QcListComponent.showListView(false);
this.route.params.subscribe(params => {
this.viewID = params['pdid'];
});
this.viewPdDetails(this.viewID);
}
viewPdDetails(editID:string){
this._qc.editPdDetails(editID).subscribe(
data => {
if (data.status == 200) {
this.pdMasterData=data.records.pd_master_details;
this.pdApplicantData= data.records.applicants_details;
this.pdDocumentsData=data.records.pd_documnets;
this.masterPdLogsData=data.records.pd_logs.master;
//this.applicantPDLogsData= data.records.pd_logs.master;
}
}, error => this.errorMessage = <any> error);
}
loadPdListCompoent() {
this.destroyType=2;
this.router.navigate([ '../../' ], { relativeTo: this.route });
this.QcListComponent.pdListLoad(true);
}
editPdMaster(masterData:any){
let record = {
"records":masterData,
"applicantLength": this.pdApplicantData.length
}
const dialogPDMaster = this.dialog.open(EditPdMasterComponent, {
data: record,
disableClose: true
});
dialogPDMaster.afterClosed()
.subscribe(dataresult => {
// this.notifier.notify('success', 'Successfully allocated.!');
this.viewPdDetails(this.viewID)
});
}
editPdApplicant(applicantData:any){
let setPdDetails = {
"pdID":this.viewID,
"records":applicantData
}
const dialogApplicant = this.dialog.open(EditPdApplicantComponent, {
data: setPdDetails,
disableClose: true
});
dialogApplicant.afterClosed()
.subscribe(dataresult => {
// this.notifier.notify('success', 'Successfully allocated.!');
this.viewPdDetails(this.viewID)
});
}
// pd allocation to
pdAllocationTo(pdData:any) {
if(pdData.fk_pd_type != 2){
const dialogRef = this.dialog.open(PdAllocationComponent, {
data: pdData,
disableClose: true
});
dialogRef.afterClosed()
.subscribe(dataresult => {
// this.notifier.notify('success', 'Successfully allocated.!');
this.viewPdDetails(this.viewID)
});
}
else if(pdData.fk_pd_type == 2){
const dialogRef = this.dialog.open(SmartPdAllocationComponent, {
data: pdData,
disableClose: true
});
dialogRef.afterClosed()
.subscribe(dataresult => {
// this.notifier.notify('success', 'Successfully allocated.!');
this.viewPdDetails(this.viewID)
});
}
}
// pd schedule details
scheduleDetails(pdData:any){
const dialogSchedule = this.dialog.open(SchedulePdComponent, {
data: pdData,
disableClose: true
});
dialogSchedule.afterClosed()
.subscribe(dataresult => {
// this.notifier.notify('success', 'Successfully allocated.!');
this.viewPdDetails(this.viewID)
});
}
// start pd
getPDStart(pdID:any){
this.destroyType=3;
this.router.navigate([ '../../startpd',pdID], { relativeTo: this.route });
}
ngOnDestroy(): void {
if(this.destroyType==1){
this.QcListComponent.pdListLoad(true);
}
}
}

View File

@ -0,0 +1,12 @@
import { TestBed } from '@angular/core/testing';
import { QcService } from './qc.service';
describe('QcService', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: QcService = TestBed.get(QcService);
expect(service).toBeTruthy();
});
});

View File

@ -0,0 +1,99 @@
/** Common Import Section */
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';//for Datatables
import { HttpClient,HttpParams } from '@angular/common/http';
import { catchError, map } from 'rxjs/operators';
import { of } from 'rxjs';
/** Imported Service Files Are., */
import { AwsService } from '../../AwsService/aws.service';
const currentdate = new Date().toJSON().slice(0,19).replace('T',' ');
/** Master Interface */
export interface Master {
master_id:number;
master_name:string;
constant_name:string;
}
@Injectable(
{
providedIn: 'root'
}
)
export class QcService {
//private apiUrl = "http://ssa.sineedge.com/sparqapi/api/";
//private apiUrl = "http://192.168.0.5:9999/AWSEC2/sparqapi/api/";
private apiUrl = "http://ssa.sineedge.com/sparqapi/api/";
MAP_API_KEY: string;
MAP_API_URL: string;
constructor(private _http: HttpClient,
private _aws:AwsService) {
this.MAP_API_KEY = 'AIzaSyBtdO5k6CRntAMJCF-H5uZjTCoSGX95cdk'
this.MAP_API_URL = `https://maps.googleapis.com/maps/api/geocode/json?key=${this.MAP_API_KEY}&address=`;
}
// get edit row pd details
editPdDetails(editId:string):Observable<any>{
let httpParams = new HttpParams().set('pdid', editId);
return this._http.post<any>(this.apiUrl+"getFullPDDetails",httpParams)
.pipe(
catchError(this.handleError('operation', []))
)
}
// update pd master details
editPdMasterDetails(editData:any,status:string):Observable<any>{
editData.pd_status = status;
editData.fk_updatedby = this._aws.getlocale();
editData.updatedon = currentdate;
return this._http.post<any>(this.apiUrl+"updatePDMaster",{records:editData})
.pipe(
catchError(this.handleError('operation', []))
)
}
//load pd template details
loadPDTemplates(pdId: string):Observable<any>{
const options = pdId ?
{ params: new HttpParams().set('pd_id', pdId) } : {};
return this._http.get<any[]>(this.apiUrl + "loadFullTemplate",options)
.pipe(
catchError(this.handleError('operation', []))
)
}
// load PD question answers
getAnswersForPD(list: any):Observable<any>{
let httpParams = new HttpParams();
httpParams = httpParams.append("category_id", list.category_id);
httpParams = httpParams.append("pd_id", list.pd_id);
httpParams = httpParams.append("question_id", list.question_id);
httpParams = httpParams.append("template_id", list.template_id);
return this._http.post<any[]>(this.apiUrl + "getAnswersForPD",httpParams)
.pipe(
catchError(this.handleError('operation', []))
)
}
// save pd answers
savePDQuestions(saveData: any): Observable<any> {
saveData.createdby = this._aws.getlocale();
saveData.fk_createdon = currentdate;
// saveData[0].fk_updatedby = this._aws.getlocale();
// saveData[0].updatedon = currentdate;
return this._http.post<any>(this.apiUrl+"savePDQuestions",{"records":saveData})
.pipe(
catchError(this.handleError('operation', []))
)
}
private handleError<T>(operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
return of(result as T);
};
}
}

View File

@ -0,0 +1,39 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { QualityCheckComponent } from './quality-check.component';
import { QcListComponent } from './qc-list/qc-list.component';
import { QcViewComponent } from './qc-list/qc-view/qc-view.component';
import { QcStartComponent } from './qc-list/qc-start/qc-start.component';
const routes: Routes =[
{
path: '',
component: QualityCheckComponent,
children: [
{
path: '',
pathMatch: 'full',
redirectTo: 'qclist'
},{
path: 'qclist',
component: QcListComponent,
children: [
{
path: 'viewpd/:pdid',
component: QcViewComponent,
},
{
path: 'startpd/:pdid',
component: QcStartComponent,
}
]
}
]
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class QualityCheckRoutingModule { }

View File

@ -0,0 +1,3 @@
<div>
<router-outlet></router-outlet>
</div>

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { QualityCheckComponent } from './quality-check.component';
describe('QualityCheckComponent', () => {
let component: QualityCheckComponent;
let fixture: ComponentFixture<QualityCheckComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ QualityCheckComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(QualityCheckComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-quality-check',
templateUrl: './quality-check.component.html',
styleUrls: ['./quality-check.component.scss']
})
export class QualityCheckComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}

View File

@ -0,0 +1,13 @@
import { QualityCheckModule } from './quality-check.module';
describe('QualityCheckModule', () => {
let qualityCheckModule: QualityCheckModule;
beforeEach(() => {
qualityCheckModule = new QualityCheckModule();
});
it('should create an instance', () => {
expect(qualityCheckModule).toBeTruthy();
});
});

View File

@ -0,0 +1,107 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OwlDateTimeModule, OwlNativeDateTimeModule } from 'ng-pick-datetime';
import { NotifierModule, NotifierOptions } from 'angular-notifier';
import { FlexLayoutModule } from '@angular/flex-layout';
import {
MatCardModule,
MatIconModule,
MatInputModule,
MatRadioModule,
MatButtonModule,MatTableModule,MatPaginatorModule,
MatProgressBarModule,MatDialogModule, MatSortModule,
MatToolbarModule,MatSelectModule,
MatListModule, MatMenuModule,
MatCheckboxModule, MatStepperModule, MatTabsModule,
MatExpansionModule, MatSidenavModule, MatButtonToggleModule, MatBadgeModule ,MatTooltipModule
} from '@angular/material';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import { AgmCoreModule } from '@agm/core';
// import completed pd components from personal discussion module
import { ManagePdModule } from './../personal-discussion/manage-pd/manage-pd.module';
//import qu routing ,and its components
import { QualityCheckRoutingModule } from './quality-check-routing.module';
import { QualityCheckComponent } from './quality-check.component';
import { QcListComponent } from './qc-list/qc-list.component';
import { QcViewComponent } from './qc-list/qc-view/qc-view.component';
import { PdAllocationComponent } from './../personal-discussion/manage-pd/list-pd/pd-allocation/pd-allocation.component';
import { SmartPdAllocationComponent } from './../personal-discussion/manage-pd/list-pd/smart-pd-allocation/smart-pd-allocation.component';
import { SchedulePdComponent } from './../personal-discussion/manage-pd/list-pd/schedule-pd/schedule-pd.component';
import { EditPdApplicantComponent } from './../personal-discussion/manage-pd/list-pd/edit-pd-applicant/edit-pd-applicant.component';
import { EditPdMasterComponent } from './../personal-discussion/manage-pd/list-pd/edit-pd-master/edit-pd-master.component';
import { QcService } from './qc-service/qc.service';
import { QcStartComponent } from './qc-list/qc-start/qc-start.component';
/**
* Custom angular notifier options
*/
const customNotifierOptions: NotifierOptions = {
position: {
horizontal: {
position: 'right',
distance: 12
},
vertical: {
position: 'top',
distance: 32,
gap: 10
}
},
theme: 'material',
behaviour: {
autoHide: 5000,
onClick: 'hide',
onMouseover: 'pauseAutoHide',
showDismissButton: true,
stacking: 4
},
animations: {
enabled: true,
show: {
preset: 'slide',
speed: 300,
easing: 'ease'
},
hide: {
preset: 'fade',
speed: 300,
easing: 'ease',
offset: 50
},
shift: {
speed: 300,
easing: 'ease'
},
overlap: 150
}
};
@NgModule({
imports: [
CommonModule,
QualityCheckRoutingModule,
OwlDateTimeModule, OwlNativeDateTimeModule,
NotifierModule.withConfig(customNotifierOptions),
FlexLayoutModule,
MatCardModule,
MatIconModule,
MatInputModule,
MatRadioModule,
MatButtonModule,MatTableModule,MatPaginatorModule,
MatProgressBarModule,MatDialogModule, MatSortModule,
MatToolbarModule,MatSelectModule,MatListModule, MatMenuModule,
MatExpansionModule,
MatStepperModule,
MatTabsModule,
MatCheckboxModule,MatSidenavModule, MatButtonToggleModule, MatBadgeModule,MatTooltipModule,
FormsModule,
ReactiveFormsModule,
AgmCoreModule.forRoot({apiKey: 'AIzaSyBtdO5k6CRntAMJCF-H5uZjTCoSGX95cdk'}),
ManagePdModule,
],
declarations: [QualityCheckComponent,QcListComponent, QcViewComponent, QcStartComponent],
entryComponents: [PdAllocationComponent, SmartPdAllocationComponent, SchedulePdComponent, EditPdApplicantComponent, EditPdMasterComponent],
providers : [QcService]
})
export class QualityCheckModule { }

View File

@ -80,6 +80,12 @@ const MENUITEMS : Menu[] = [
// children:[
// {state:'pdtriggerlist',name:'Pd Trigger Listing'}
// ]
},
{
state:'quality_check_discussion',
name:'Quality Check',
type:'link',
icon:'forum',
}
];