new modifications

main
sajan 3 years ago
parent 3435381a7b
commit abb18f7321

@ -23,7 +23,7 @@ export class AuthHeaderInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler) { intercept(request: HttpRequest<any>, next: HttpHandler) {
if (request.url.includes('auth')) if (request.url.includes('auth'))
return next.handle(this.addAuthKey(request)) return next.handle(this.addAuthenticationToken(request))
if (request.url.startsWith('assets/') && request.url.endsWith('.json')) if (request.url.startsWith('assets/') && request.url.endsWith('.json'))
return next.handle(request) return next.handle(request)
@ -49,20 +49,22 @@ export class AuthHeaderInterceptor implements HttpInterceptor {
})); }));
} }
private addAuthKey(request: HttpRequest<any>): HttpRequest<any>{ // private addAuthKey(request: HttpRequest<any>): HttpRequest<any>{
// If we do not have a token yet then we should not set the header. // // If we do not have a token yet then we should not set the header.
// Here we could first retrieve the token from where we store it. // // Here we could first retrieve the token from where we store it.
let authKey = localStorage.getItem("authKey"); // let authKey = localStorage.getItem("authtoken");
// authKey = this.crypto.decrypt(authKey); // console.log(authKey);
if (!authKey) {
return request; // authKey = this.crypto.decrypt(authKey);
} // if (!authKey) {
return request.clone({ // return request;
setHeaders: { // }
'authkey': `${authKey}`, // return request.clone({
}, // setHeaders: {
}); // 'authkey': `${authKey}`,
} // },
// });
// }
private addAuthenticationToken(request: HttpRequest<any>, hasRefreshToken?: boolean): HttpRequest<any> { private addAuthenticationToken(request: HttpRequest<any>, hasRefreshToken?: boolean): HttpRequest<any> {
// If we do not have a token yet then we should not set the header. // If we do not have a token yet then we should not set the header.

@ -0,0 +1,5 @@
export class CommonDto {
id?:any;
marquee?:any;
}

@ -82,16 +82,12 @@
<mat-form-field style="width: 100%" appearance="outline"> <mat-form-field style="width: 100%" appearance="outline">
<mat-label>{{ 'enterOtp' | translate }}</mat-label> <mat-label>{{ 'enterOtp' | translate }}</mat-label>
<input matInput [(ngModel)]="userDetails.otp" type="text" placeholder="{{ 'enterOtp' | translate }}" style="width:100%;border-bottom: 0px;"> <input matInput [(ngModel)]="userDetails.otp" type="text" placeholder="{{ 'enterOtp' | translate }}" style="width:100%;border-bottom: 0px;">
<mat-icon
matTooltip="{{ 'Please check both inbox and spam folder for OTP' | translate }}"
matTooltipPosition="above"
class="tooltip-icon"
style="position: absolute; top: 37%; right: 0; transform: translateY(-50%);">
info_outline
</mat-icon>
</mat-form-field> </mat-form-field>
</div> </div>
<div class="col-12" style="text-align: center;">
<span style="text-align: center;font-family: nucleo; color: #1e3d3b;">{{ 'Please check both inbox and spam folder for OTP.' | translate }}</span><br><br>
</div><br>
<div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10" style="text-align: center;"> <div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10" style="text-align: center;">
<button mat-raised-button (click)="validation()" class="submitButton">{{ 'submit' | <button mat-raised-button (click)="validation()" class="submitButton">{{ 'submit' |
translate }}</button> translate }}</button>

@ -46,7 +46,7 @@
<div class="col-3"></div> <div class="col-3"></div>
<div class="col-3"></div> <div class="col-3"></div>
<div class="col-5 "> <div class="col-5 ">
<button class="hide-on-print printButton" mat-raised-button (click)="print()" >Print <i class="fa fa-arrow-down" style="font-size: small;"></i></button>&nbsp; <button class="hide-on-print printButton" *ngIf="!CancelTenderButtons" mat-raised-button (click)="print()" >Print <i class="fa fa-arrow-down" style="font-size: small;"></i></button>&nbsp;
</div> </div>
<div class="col-1 "></div> <div class="col-1 "></div>
@ -359,7 +359,7 @@
<tr class="hide-on-print"> <tr class="hide-on-print">
<th colspan="12"> <th colspan="12">
<button *ngIf="showDownloadButton" mat-raised-button id="zipFile" class="hide-on-print DownloadZipButton" (click)="downloadWITZip()"> <i class="bi bi-file-earmark-zip" ></i> Download </button> <button *ngIf="showDownloadButton && !CancelTenderButtons" mat-raised-button id="zipFile" class="hide-on-print DownloadZipButton" (click)="downloadWITZip()"> <i class="bi bi-file-earmark-zip" ></i> Download </button>
<p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p> <p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p>
</th> </th>
@ -376,7 +376,7 @@
<tr class="hide-on-print"> <tr class="hide-on-print">
<th colspan="12">Drawings <th colspan="12">Drawings
<button *ngIf="showDownloadButton" mat-raised-button id="zipFile" class="hide-on-print DownloadZipButton" (click)="DownloadDrawingsZIP()"> <i class="bi bi-file-earmark-zip"></i> Download</button> <button *ngIf="showDownloadButton && !CancelTenderButtons" mat-raised-button id="zipFile" class="hide-on-print DownloadZipButton" (click)="DownloadDrawingsZIP()"> <i class="bi bi-file-earmark-zip"></i> Download</button>
<p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p> <p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p>
</th> </th>

@ -23,6 +23,8 @@ export class ViewComponent implements OnInit {
OnlinePayment: boolean; OnlinePayment: boolean;
currentDate = new Date(); currentDate = new Date();
showDownloadButton: boolean; showDownloadButton: boolean;
activeYn: string;
CancelTenderButtons: boolean;
@ -50,12 +52,19 @@ getData(){
// console.log("tenderData",res); // console.log("tenderData",res);
this.tenderData = res this.tenderData = res
this.tenderDocuments = this.tenderData['tenderDoc'] this.tenderDocuments = this.tenderData['tenderDoc']
this.activeYn = this.tenderData['activeYn'];
if(this.tenderData.paymentModeD.paymentMode == 'Online'){ if(this.tenderData.paymentModeD.paymentMode == 'Online'){
this.OnlinePayment = true this.OnlinePayment = true
}else { }else {
this.OnlinePayment = false; this.OnlinePayment = false;
} }
if(this.activeYn == 'N'){
this.CancelTenderButtons = true
}else if(this.activeYn == 'Y'){
this.CancelTenderButtons = false
}
const saleStartDate = new Date(this.tenderData.saleStartDate); const saleStartDate = new Date(this.tenderData.saleStartDate);

@ -29,18 +29,18 @@
<body > <body >
<!-- ======= Header ======= --> <!-- ======= Header ======= -->
<header id="header" class="fixed-top d-flex align-items-center"> <header id="header" class="fixed-top d-flex align-items-center" style="background-image: url('/assets/img/greenployg3.jpg');background-size: cover;background-repeat: no-repeat;background-position: center;padding: 10px;height:100px">
<div class="container d-flex align-items-center"> <div class="container d-flex align-items-center" >
<div class="logo me-auto" > <div class="logo me-auto" >
<p></p> <h2> <p></p> <h2>
<a ><img src="assets\img\emblem2.jpg" alt="" class="img-fluid"><span class="titleName">Thrickodithanam SCB</span></a> <a ><img src="assets\img\emblem3.png" alt="" class="img-fluid"><span class="titleName">Thrickodithanam SCB</span></a>
<!-- <a href="index.html"><img src="assets\img\emblem2.jpg" alt="" class="img-fluid"> THRICKODITHANAM SCB</a> --> <!-- <a href="index.html"><img src="assets\img\emblem2.jpg" alt="" class="img-fluid"> THRICKODITHANAM SCB</a> -->
</h2> </h2>
</div> </div>
<nav id="navbar" class="navbar"> <nav id="navbar" class="navbar">
<ul> <ul>
<li><a class="nav-link scrollto active" href="#hero">Home</a></li> <li><a class="nav-link scrollto" href="#hero">Home</a></li>
<li><a class="nav-link scrollto" href="#about">About Us</a></li> <li><a class="nav-link scrollto" href="#about">About Us</a></li>
<li><a class="nav-link scrollto" href="#services">Services</a></li> <li><a class="nav-link scrollto" href="#services">Services</a></li>
<li><a class="nav-link scrollto" href="#branches">Branches</a></li> <li><a class="nav-link scrollto" href="#branches">Branches</a></li>
@ -67,16 +67,16 @@
</nav><!-- .navbar --> </nav><!-- .navbar -->
</div> </div>
</header> </header>
<!-- End #header --> <!-- End #header -->
<!-- Start Marquee --> <!-- Start Marquee -->
<section id="Marquee"> <section id="Marquee">
<div class="marquee-container"> <div class="marquee-container">
<div class="marquee-content"> <div class="marquee-content">
<p>സ്വാഗതം തൃക്കൊടിത്താനം സര്‍വ്വീസ് സഹകരണ ബാങ്ക് LTD No.178 &nbsp;&nbsp;1920 ആഗസ്റ്റ് മാസത്തിൽ പ്രവർത്തനം ആരഭിച്ച്100 വർഷക്കാലമായി തൃക്കൊടിത്താനം ഗ്രാമപഞ്ചായത്തിലെ കർഷകരുടെ <p>{{marqueeText}}</p>
താങ്ങും തണലുമായി പ്രവർത്തിക്കുന്നു</p>
</div> </div>
</div> </div>
</section> </section>
@ -94,7 +94,7 @@
<main id="main"> <main id="main">
<!-- ======= About Us Section ======= --> <!-- ======= About Us Section ======= -->
<br><section id="about" class="about"> <br><section id="about" class="about"><br><br>
<div class="container"> <div class="container">
<div class="section-title"> <div class="section-title">
@ -133,7 +133,7 @@
</section><br><!-- End About Us Section --> </section><br><!-- End About Us Section -->
<!-- ======= Services Section ======= --> <!-- ======= Services Section ======= -->
<section id="services" class="services section-bg"> <section id="services" class="services section-bg"><br><br>
<div class="container"> <div class="container">
<div class="section-title"> <div class="section-title">
@ -180,7 +180,7 @@
</section><!-- End Services Section --> </section><!-- End Services Section -->
<!-- ======= Branches Section ======= --> <!-- ======= Branches Section ======= -->
<section id="branches" class="branches section"> <section id="branches" class="branches section"><br><br>
<div class="container"> <div class="container">
<div class="section-title"> <div class="section-title">
@ -227,7 +227,7 @@
<!-- ======= Call To Action Section ======= --> <!-- ======= Call To Action Section ======= -->
<section id= "call-to-action" div class="call-to-action"> <section id= "call-to-action" div class="call-to-action"><br><br>
<div class="container"> <div class="container">
<div class="text-center"> <div class="text-center">
<h3>TENDERS</h3> <h3>TENDERS</h3>
@ -241,7 +241,7 @@
<!-- End Call To Action Section --> <!-- End Call To Action Section -->
<!-- ======= Contact Us Section ======= --> <!-- ======= Contact Us Section ======= -->
<section id="contact" class="contact section-bg"> <section id="contact" class="contact section-bg"><br><br>
<div class="container"> <div class="container">
<div class="section-title"> <div class="section-title">
@ -327,14 +327,14 @@
<a href="#" class="back-to-top d-flex align-items-center justify-content-center"><i class="bi bi-arrow-up-short"></i></a> <a href="#" class="back-to-top d-flex align-items-center justify-content-center"><i class="bi bi-arrow-up-short"></i></a>
<!-- Vendor JS Files --> <!-- Vendor JS Files -->
<script src="/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="/src/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="/assets/vendor/glightbox/js/glightbox.min.js"></script> <script src="/src/assets/vendor/glightbox/js/glightbox.min.js"></script>
<script src="/assets/vendor/isotope-layout/isotope.pkgd.min.js"></script> <script src="/src/assets/vendor/isotope-layout/isotope.pkgd.min.js"></script>
<script src="/assets/vendor/swiper/swiper-bundle.min.js"></script> <script src="/src/assets/vendor/swiper/swiper-bundle.min.js"></script>
<script src="/assets/vendor/php-email-form/validate.js"></script> <script src="/src/assets/vendor/php-email-form/validate.js"></script>
<!-- Template Main JS File --> <!-- Template Main JS File -->
<script src="/assets/js/main.js"></script> <script src="/src/assets/js/main.js"></script>
</body> </body>

@ -1,5 +1,7 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
import { MasterService } from 'src/app/_providers/_services/master.service';
@Component({ @Component({
selector: 'app-website', selector: 'app-website',
@ -8,15 +10,27 @@ import { Router } from '@angular/router';
}) })
export class WebsiteComponent implements OnInit { export class WebsiteComponent implements OnInit {
marqueeText: any = '';
constructor( constructor(
private router:Router private router:Router,
private _masterService : MasterService
) { } ) { }
ngOnInit(): void { ngOnInit(): void {
this.getMarqueeData();
} }
openTender(){ openTender(){
this.router.navigate(['/auth/admin-home']) this.router.navigate(['/auth/admin-home'])
} }
getMarqueeData(){
this._masterService.getMasterData(apiUrl.common).then(res=>{
if(res && res.length > 0 && res[0].marquee && res[0].marquee != '' ){
this.marqueeText = res[0].marquee
}
})
}
} }

@ -1,5 +1,5 @@
<div class="container-responsive"> <div class="container-responsive">
<mat-progress-bar mode="indeterminate" *ngIf="loading"></mat-progress-bar> <mat-progress-bar mode="indeterminate" *ngIf="loading"></mat-progress-bar>
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;"> <!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
<div class="container"> <div class="container">
@ -24,10 +24,10 @@
<li class="nav-item"> <li class="nav-item">
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p> <p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
</li> --> </li> -->
<!-- <li class="nav-item"> <!-- <li class="nav-item">
<p class="nav-link sign-out-link" (click)="signOut()">Sign In <i class="bi bi-person-plus-fill"></i></p> <p class="nav-link sign-out-link" (click)="signOut()">Sign In <i class="bi bi-person-plus-fill"></i></p>
</li> --> </li> -->
<!-- <li class="nav-item"> <!-- <li class="nav-item">
<p class="nav-link sign-out-link" (click)="signOut()">Sign Out <i class="bi bi-person-x-fill"></i></p> <p class="nav-link sign-out-link" (click)="signOut()">Sign Out <i class="bi bi-person-x-fill"></i></p>
</li> </li>
</ul> </ul>
@ -54,9 +54,14 @@
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<div style="text-align: right;margin-bottom: 5px;" *ngIf="seculevel == 'B'"> <div style="text-align: right;margin-bottom: 5px;" *ngIf="seculevel == 'B'">
<button mat-raised-button (click)="addNewTender()" class="addButton">+{{ 'addTender' | translate }}</button> <button mat-raised-button (click)="openNotificationDialog(notification)" class="notificationButton">{{
</div> 'Notifications' | translate }}</button>
<button mat-raised-button (click)="addNewTender()" class="addButton">+{{ 'addTender' | translate }}</button>
</div>
<div class="card-responsive"> <div class="card-responsive">
<div class="card-body-responsive"> <div class="card-body-responsive">
@ -88,231 +93,438 @@
</tr> </tr>
</tbody> </tbody>
</table> --> </table> -->
<ng-container > <ng-container>
<mat-card class="card"> <mat-card class="card">
<div class="top-bar"> <div class="top-bar">
<div class="top-left-float"> <div class="top-left-float">
<span class="searchInputSpan"> <span class="searchInputSpan">
<mat-icon style="margin-right: 3px;margin-left:5px; transform: translateY(10px);">search</mat-icon> <mat-icon
<mat-form-field> style="margin-right: 3px;margin-left:5px; transform: translateY(10px);">search</mat-icon>
<input matInput placeholder="{{ 'search' | translate }}" style="width: fit-content;" <mat-form-field>
[(ngModel)]="searchTerm" (keyup)="search()"/> <input matInput placeholder="{{ 'search' | translate }}" style="width: fit-content;"
</mat-form-field> [(ngModel)]="searchTerm" (keyup)="search()" />
</span> </mat-form-field>
<!-- <button mat-raised-button class="addButton" (click)="search()"> {{ 'go' | translate }} </span>
<!-- <button mat-raised-button class="addButton" (click)="search()"> {{ 'go' | translate }}
</button>&nbsp; --> </button>&nbsp; -->
<button mat-raised-button class="addButton" (click)="reset()"> {{ 'clear' | translate }} <button mat-raised-button class="addButton" (click)="reset()"> {{ 'clear' | translate }}
</button> </button>
</div> </div>
</div> </div>
<br> <br>
<br> <br>
<mat-table [dataSource]="dataSource" style="min-width: 500px;display: table;" matSort matSortDisableClear="true" (matSortChange)="sortData($event)" <mat-table [dataSource]="dataSource" style="min-width: 500px;display: table;" matSort
class="table"> matSortDisableClear="true" (matSortChange)="sortData($event)" class="table">
<ng-container matColumnDef="actions" class="table-column" > <ng-container matColumnDef="actions" class="table-column">
<th mat-header-cell *matHeaderCellDef style="padding: 5px;" style="width:70px" class="table-headers"> <th mat-header-cell *matHeaderCellDef style="padding: 5px;" style="width:70px"
class="table-headers">
<!-- {{ 'actions' | translate }} --> <!-- {{ 'actions' | translate }} -->
<!-- <mat-icon>sort</mat-icon> --> <!-- <mat-icon>sort</mat-icon> -->
</th> </th>
<td mat-cell *matCellDef="let element;let i=index" style="padding: 5px;" class="table-content first-column"> <td mat-cell *matCellDef="let element;let i=index" style="padding: 5px;"
<button class="editButton" mat-button *ngIf="!element.HideEdit" class="table-content first-column">
(click)="goToEdit(element.id)" [disabled]="false"> <button class="editButton" mat-button *ngIf="!element.HideEdit" (click)="goToEdit(element.id)"
<svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 512 512"><path d="M290.74 93.24l128.02 128.02-277.99 277.99-114.14 12.6C11.35 513.54-1.56 500.62.14 485.34l12.7-114.22 277.9-277.88zm207.2-19.06l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.76 18.75-49.16 0-67.91z" fill="#424242"/></svg> [disabled]="false">
</button> <svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 512 512">
</td> <path
</ng-container> d="M290.74 93.24l128.02 128.02-277.99 277.99-114.14 12.6C11.35 513.54-1.56 500.62.14 485.34l12.7-114.22 277.9-277.88zm207.2-19.06l-60.11-60.11c-18.75-18.75-49.16-18.75-67.91 0l-56.55 56.55 128.02 128.02 56.55-56.55c18.75-18.76 18.75-49.16 0-67.91z"
fill="#424242" />
<ng-container matColumnDef="slno"> </svg>
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px;text-align: center;"> </button>
{{ 'slno' | translate }} </td>
<!-- <mat-icon>sort</mat-icon> --> </ng-container>
</th>
<td mat-cell *matCellDef="let element;let i = index" style="padding: 5px;text-align: center;" class="table-content"> <ng-container matColumnDef="slno">
{{i+1}} <th mat-header-cell *matHeaderCellDef class="table-headers"
</td> style="width:80px;text-align: center;">
</ng-container> {{ 'slno' | translate }}
<!-- <mat-icon>sort</mat-icon> -->
</th>
<td mat-cell *matCellDef="let element;let i = index" style="padding: 5px;text-align: center;"
class="table-content">
{{i+1}}
</td>
</ng-container>
<ng-container matColumnDef="title"> <ng-container matColumnDef="title">
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers" style="width:270px"> <th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers" style="width:270px">
{{ 'title' | translate }} {{ 'title' | translate }}
<!-- <mat-icon>sort</mat-icon> --> <!-- <mat-icon>sort</mat-icon> -->
</th> </th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content"> <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
{{element?.title}} {{element?.title}}
</td> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="publishedDate"> <ng-container matColumnDef="publishedDate">
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers"> <th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
{{ 'publishedDate' | translate }} {{ 'publishedDate' | translate }}
<!-- <mat-icon>sort</mat-icon> --> <!-- <mat-icon>sort</mat-icon> -->
</th> </th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content"> <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
{{element?.publishDate| date:"YYYY-MM-dd"}} {{element?.publishDate| date:"YYYY-MM-dd"}}
</td> </td>
<!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content"> <!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
<button mat-raised-button>edit</button> <button mat-raised-button>edit</button>
</td> --> </td> -->
</ng-container> </ng-container>
<ng-container matColumnDef="bidOpenDate"> <ng-container matColumnDef="bidOpenDate">
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers" > <th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
{{ 'bidOpenDate' | translate }} {{ 'bidOpenDate' | translate }}
<!-- <mat-icon>sort</mat-icon> --> <!-- <mat-icon>sort</mat-icon> -->
</th> </th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content"> <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
{{element?.bidOpenDate| date:"YYYY-MM-dd"}} {{element?.bidOpenDate| date:"YYYY-MM-dd"}}
</td> </td>
<!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content"> <!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
<button mat-raised-button>edit</button> <button mat-raised-button>edit</button>
</td> --> </td> -->
</ng-container> </ng-container>
<ng-container matColumnDef="status"> <ng-container matColumnDef="status">
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers" > <th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
{{ 'status' | translate }} {{ 'status' | translate }}
</th> </th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content"> <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
<span *ngIf="element.hide == 'Active'" class="activeSpan" >&nbsp;&nbsp;&nbsp;{{element?.hide}}&nbsp;&nbsp;&nbsp;</span> <span *ngIf="element.hide == 'Active' && element.activeYn =='Y'"
<span *ngIf="element.hide == 'Await'" class="awaitSpan">&nbsp;&nbsp;&nbsp;{{element?.hide}}&nbsp;&nbsp;&nbsp;</span> class="activeSpan">&nbsp;&nbsp;&nbsp;{{element?.hide}}&nbsp;&nbsp;&nbsp;</span>
<span *ngIf="element.hide == 'Closed'" class="closedSpan">&nbsp;&nbsp;&nbsp;{{element?.hide}}&nbsp;&nbsp;&nbsp;</span> <span *ngIf="element.hide == 'Await' && element.activeYn =='Y'"
class="awaitSpan">&nbsp;&nbsp;&nbsp;{{element?.hide}}&nbsp;&nbsp;&nbsp;</span>
</td> <span *ngIf="element.hide == 'Closed' && element.activeYn =='Y'"
class="closedSpan">&nbsp;&nbsp;&nbsp;{{element?.hide}}&nbsp;&nbsp;&nbsp;</span>
</ng-container> <span *ngIf="element.activeYn== 'N' "
class="canceledSpan">&nbsp;&nbsp;&nbsp;{{'Canceled'}}&nbsp;&nbsp;&nbsp;</span>
<ng-container matColumnDef="userPayments"> </td>
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:100px;text-align: center;">
{{ 'payments' | translate }} </ng-container>
<!-- <mat-icon>sort</mat-icon> -->
</th>
<td mat-cell *matCellDef="let element" style="padding: 5px;text-align: center;" class="table-content">
<button mat-button <ng-container matColumnDef="userPayments">
(click)="goToPayment(element.id)" [disabled]="false"> <th mat-header-cell *matHeaderCellDef class="table-headers"
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="1em" style="height: 18px;" viewBox="0 0 512 512"><path d="M320 464c8.8 0 16-7.2 16-16V160H256c-17.7 0-32-14.3-32-32V48H64c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320zM0 64C0 28.7 28.7 0 64 0H229.5c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64z" fill="#424242"/></svg> --> style="width:100px;text-align: center;">
<svg xmlns="http://www.w3.org/2000/svg" height="1.3em" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M438.6 150.6c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.7 96 32 96C14.3 96 0 110.3 0 128s14.3 32 32 32l306.7 0-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96zm-333.3 352c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 416 416 416c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0 41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96z" fill="#424242"/></svg> {{ 'payments' | translate }}
</button> <!-- <mat-icon>sort</mat-icon> -->
</th>
</td> <td mat-cell *matCellDef="let element" style="padding: 5px;text-align: center;"
</ng-container> class="table-content">
<button mat-button *ngIf="element.activeYn=='Y'" (click)="goToPayment(element.id)" [disabled]="false">
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="1em" style="height: 18px;" viewBox="0 0 512 512"><path d="M320 464c8.8 0 16-7.2 16-16V160H256c-17.7 0-32-14.3-32-32V48H64c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320zM0 64C0 28.7 28.7 0 64 0H229.5c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64z" fill="#424242"/></svg> -->
<ng-container matColumnDef="view"> <svg xmlns="http://www.w3.org/2000/svg" height="1.3em"
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:100px;text-align: center;"> viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
{{ 'view' | translate }} <path
<!-- <mat-icon>sort</mat-icon> --> d="M438.6 150.6c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.7 96 32 96C14.3 96 0 110.3 0 128s14.3 32 32 32l306.7 0-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96zm-333.3 352c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 416 416 416c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0 41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96z"
</th> fill="#424242" />
<td mat-cell *matCellDef="let element" style="padding: 5px;text-align: center;" class="table-content"> </svg>
<button mat-button </button>
(click)="goToView(element.id)" [disabled]="false">
<svg xmlns="http://www.w3.org/2000/svg" height="1em" style="height: 18px;" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M320 464c8.8 0 16-7.2 16-16V160H256c-17.7 0-32-14.3-32-32V48H64c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320zM0 64C0 28.7 28.7 0 64 0H229.5c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64z" fill="#424242"/></svg> </td>
</ng-container>
</button>
</td> <ng-container matColumnDef="view">
</ng-container> <th mat-header-cell *matHeaderCellDef class="table-headers"
style="width:100px;text-align: center;">
<ng-container matColumnDef="report"> {{ 'view' | translate }}
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px"> <!-- <mat-icon>sort</mat-icon> -->
{{ 'report' | translate }} </th>
<!-- <mat-icon>sort</mat-icon> --> <td mat-cell *matCellDef="let element" style="padding: 5px;text-align: center;"
</th> class="table-content">
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content"> <button mat-button (click)="goToView(element.id)" [disabled]="false">
<button class="reportButton" mat-button *ngIf="element.reportHide =='false'" <svg xmlns="http://www.w3.org/2000/svg" height="1em" style="height: 18px;"
(click)="goToReport(element.id)" > viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<!-- <mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#353535'}"> <path
d="M320 464c8.8 0 16-7.2 16-16V160H256c-17.7 0-32-14.3-32-32V48H64c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320zM0 64C0 28.7 28.7 0 64 0H229.5c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64z"
fill="#424242" />
</svg>
</button>
</td>
</ng-container>
<ng-container matColumnDef="report">
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
{{ 'report' | translate }}
<!-- <mat-icon>sort</mat-icon> -->
</th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
<button class="reportButton" mat-button *ngIf="element.reportHide =='false'"
(click)="goToReport(element.id)">
<!-- <mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#353535'}">
assessment assessment
</mat-icon> --> </mat-icon> -->
<svg style="height: 60%;margin-bottom: 4px;" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 576 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z" fill="#424242"/></svg> <svg style="height: 60%;margin-bottom: 4px;" xmlns="http://www.w3.org/2000/svg" height="1em"
</button> viewBox="0 0 576 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path
</td> d="M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z"
</ng-container> fill="#424242" />
</svg>
<ng-container matColumnDef="upload"> </button>
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
{{ 'upload' | translate }}
<!-- <mat-icon>sort</mat-icon> -->
</th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
<button *ngIf="element.hide =='Active'" style="padding: 0;" mat-button color="primary"
(click)="goToUpload(element.id)" >
<mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#353535'}">
cloud_upload
</mat-icon>
</button>
</td>
</ng-container>
<ng-container matColumnDef="Paymentstatus">
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:110px">
{{ 'Paymentstatus' | translate }}
</th>
<td mat-cell *matCellDef="let element" style="padding: 5px;text-align: center;" class="table-content">
<div *ngIf="element.countStatusP!= 0">
<svg (click)="goToPaymentDetails(element.id)" style="cursor: pointer;" xmlns="http://www.w3.org/2000/svg" height="1.4em" viewBox="0 0 576 512"><path d="M512 80c8.8 0 16 7.2 16 16v32H48V96c0-8.8 7.2-16 16-16H512zm16 144V416c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V224H528zM64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H512c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm56 304c-13.3 0-24 10.7-24 24s10.7 24 24 24h48c13.3 0 24-10.7 24-24s-10.7-24-24-24H120zm128 0c-13.3 0-24 10.7-24 24s10.7 24 24 24H360c13.3 0 24-10.7 24-24s-10.7-24-24-24H248z" fill="#424242"/></svg><span class="circle-span" >{{ element.countStatusP }}</span>
</div>
<div *ngIf="element.countStatusP == 0">
<svg (click)="goToPaymentDetails(element.id)" style="cursor: pointer;margin-left:-19px;" xmlns="http://www.w3.org/2000/svg" height="1.4em" viewBox="0 0 576 512"><path d="M512 80c8.8 0 16 7.2 16 16v32H48V96c0-8.8 7.2-16 16-16H512zm16 144V416c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V224H528zM64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H512c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm56 304c-13.3 0-24 10.7-24 24s10.7 24 24 24h48c13.3 0 24-10.7 24-24s-10.7-24-24-24H120zm128 0c-13.3 0-24 10.7-24 24s10.7 24 24 24H360c13.3 0 24-10.7 24-24s-10.7-24-24-24H248z" fill="#424242"/></svg>
</div>
</td>
</ng-container>
<ng-container matColumnDef="loading"> </td>
<td mat-footer-cell *matFooterCellDef="" colspan="5"> </ng-container>
{{ 'loadingData' | translate }}
<!-- <ng-container matColumnDef="cancelTender">
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
{{ 'Cancel' | translate }}
</th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
<button class="reportButton" mat-button
(click)="CancelTender(element.id)">
<svg style="height: 60%;margin-bottom: 4px;" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 448 512"><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z" fill="#424242"/></svg>
</button>
<mat-card *ngIf="showPopup" class="popup-card mainCard">
<br>
<div class="popup-container">
<mat-card-subtitle style="text-align: center;">
<div class="row">
<div class="col-12">
<span class="resetSpan">{{ 'digitalSignature' | translate }}</span>
<div class="float-right">
<a style="cursor: pointer;color: rgb(0, 0, 0); " class="normalText" (click)="openHelpDialog(help)" ><h5><i class="bi bi-info-circle"></i></h5></a>
</div>
</div>
</div>
</mat-card-subtitle><br>
<mat-card-content class="centered-form">
<mat-form-field class="columns" appearance="outline" style="width: 90%;">
<mat-label style=" font-family: nucleo;" *ngIf="Secretary; else SecretarySignature">
{{Secretary}}</mat-label>
<ng-template #SecretarySignature>
<mat-label style=" font-family: nucleo;"> {{ 'SecretarySignature' | translate }}
</mat-label>
</ng-template>
<input matInput readonly [(ngModel)]="Secretary">
<button mat-icon-button matSuffix *ngIf="!this.fileSelected"
(click)="assetFileInput.click();">
<mat-icon>attach_file</mat-icon>
</button>
<input hidden (change)="UploadsecretaryFiles($event,Secretary)" #assetFileInput
type="file" id="file" value="Secretary">
</mat-form-field>
<mat-form-field appearance="outline" style="width: 90%;">
<mat-label style=" font-family: nucleo;" *ngIf="President; else PresidentSignature">
{{President}}</mat-label>
<ng-template #PresidentSignature>
<mat-label style=" font-family: nucleo;"> {{ 'PresidentSignature' | translate }}
</mat-label>
</ng-template>
<input matInput readonly [(ngModel)]="President" >
<button mat-icon-button matSuffix *ngIf="!this.fileSelected2"
(click)="assetFileInput2.click();">
<mat-icon>attach_file</mat-icon>
</button>
<input hidden (change)="UploadPresidentFiles($event,President)" #assetFileInput2
type="file" id="file2" value="President">
</mat-form-field>
</mat-card-content>
<mat-card-actions class="float-right">
<button mat-button (click)="VerifySignature()" class="popUpButtons">Verify</button>
<button mat-button (click)="closePopup()" class="popUpButtons">Close</button>
</mat-card-actions>
</div>
<ng-template #help>
<div class="normalText">
<div class="row" style="text-align: center;">
<div class="col-12">
<span class="helpHeading">How can I Validate Digital Signature? </span>
</div>
</div>
<br>
<br>
<h6> Connect Security Device
</h6>
<ul>
<li> Plug in the security device that has the necessary security keys.
</li>
</ul>
<h6> Select Key Files
</h6>
<ul>
<li> Choose the Public key files for both the secretary and the president, usually provided on the security device.
</li>
<li>Locate the Public key document or file that you want to validate.</li>
</ul>
<div class="row" style="text-align: center;">
<div class="col-12" >
<span style="font-family: nucleo;font-size: larger; color: #1e3d3b;">You can access Tender Reports only after validating the digital signatures of President and Secretary.</span>
</div>
</div>
<div style="text-align: right;">
<a style="color: #46AC9E;cursor: pointer;" (click)="closeDialog()">Close</a>
</div>
</div>
</ng-template>
</mat-card>
</td> </td>
</ng-container>
<ng-container matColumnDef="nodata"> </ng-container> -->
<td mat-footer-cell *matFooterCellDef="" colspan="5">
<ng-container matColumnDef="upload">
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
{{ 'upload' | translate }}
<!-- <mat-icon>sort</mat-icon> -->
</th>
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
<button *ngIf="element.hide =='Active' && element.activeYn=='Y'" style="padding: 0;" mat-button color="primary"
(click)="goToUpload(element.id)">
<mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#353535'}">
cloud_upload
</mat-icon>
</button>
</td>
</ng-container>
<ng-container matColumnDef="Paymentstatus">
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:110px">
{{ 'Paymentstatus' | translate }}
</th>
<td mat-cell *matCellDef="let element" style="padding: 5px;text-align: center;"
class="table-content">
<div *ngIf="element.countStatusP!= 0">
<svg (click)="goToPaymentDetails(element.id)" style="cursor: pointer;"
xmlns="http://www.w3.org/2000/svg" height="1.4em" viewBox="0 0 576 512">
<path
d="M512 80c8.8 0 16 7.2 16 16v32H48V96c0-8.8 7.2-16 16-16H512zm16 144V416c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V224H528zM64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H512c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm56 304c-13.3 0-24 10.7-24 24s10.7 24 24 24h48c13.3 0 24-10.7 24-24s-10.7-24-24-24H120zm128 0c-13.3 0-24 10.7-24 24s10.7 24 24 24H360c13.3 0 24-10.7 24-24s-10.7-24-24-24H248z"
fill="#424242" />
</svg><span class="circle-span" (click)="goToPaymentDetails(element.id)">{{
element.countStatusP }}</span>
</div>
<div *ngIf="element.countStatusP == 0">
<svg (click)="goToPaymentDetails(element.id)" style="cursor: pointer;margin-left:-19px;"
xmlns="http://www.w3.org/2000/svg" height="1.4em" viewBox="0 0 576 512">
<path
d="M512 80c8.8 0 16 7.2 16 16v32H48V96c0-8.8 7.2-16 16-16H512zm16 144V416c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V224H528zM64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H512c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm56 304c-13.3 0-24 10.7-24 24s10.7 24 24 24h48c13.3 0 24-10.7 24-24s-10.7-24-24-24H120zm128 0c-13.3 0-24 10.7-24 24s10.7 24 24 24H360c13.3 0 24-10.7 24-24s-10.7-24-24-24H248z"
fill="#424242" />
</svg>
</div>
</td>
</ng-container>
<ng-container matColumnDef="loading">
<td mat-footer-cell *matFooterCellDef="" colspan="5">
{{ 'loadingData' | translate }}
</td>
</ng-container>
<ng-container matColumnDef="nodata">
<td mat-footer-cell *matFooterCellDef="" colspan="5">
{{ 'noDataToDisplay' | translate }} {{ 'noDataToDisplay' | translate }}
</td> </td>
</ng-container> </ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr> <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
<tr mat-footer-row *matFooterRowDef="['loading']" [ngClass]="{'hide': !loading}"></tr> <tr mat-footer-row *matFooterRowDef="['loading']" [ngClass]="{'hide': !loading}"></tr>
<tr mat-footer-row *matFooterRowDef="['nodata']" [ngClass]="{'hide': (!noData || loading)}"></tr> <tr mat-footer-row *matFooterRowDef="['nodata']" [ngClass]="{'hide': (!noData || loading)}"></tr>
</mat-table> </mat-table>
<mat-paginator #paginator [length]="pageLength" [pageSize]="10" [pageSizeOptions]="[5, 10, 25, 100]" <mat-paginator #paginator [length]="pageLength" [pageSize]="10" [pageSizeOptions]="[5, 10, 25, 100]"
aria-label="Select page"> aria-label="Select page">
</mat-paginator> </mat-paginator>
</mat-card> </mat-card>
</ng-container> </ng-container>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div><br><br> </div><br><br>
<div class="footer" > <div class="footer">
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;" class="py-3"> <footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;"
<div class="container"> class="py-3">
<div class="row"> <div class="container">
<div class="col-md-12 text-center"> <div class="row">
<p class="mb-0">&copy; <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023. </span>All Rights Reserved</p> <div class="col-md-12 text-center">
<p class="mb-0">Designed by <a href="https://www.simssoftware.in/" style="color: #ffffff;">SiMS</a></p> <p class="mb-0">&copy; <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023.
</div> </span>All Rights Reserved</p>
<p class="mb-0">Designed by <a href="https://www.simssoftware.in/" style="color: #ffffff;">SiMS</a></p>
</div> </div>
</div> </div>
</footer>
</div> </div>
</footer>
</div>
</div> </div>
<ng-template #notification>
<h6>Notification</h6>
<div class="row">
<mat-form-field [style.fontSize]="16" appearance="outline">
<mat-label>Notification Text</mat-label>
<textarea matInput [(ngModel)]="commonData.marquee" cdkTextareaAutosize #autosize="cdkTextareaAutosize"
cdkAutosizeMinRows="1" cdkAutosizeMaxRows="8" maxlength="300"></textarea>
</mat-form-field>
</div>
<div class="row">
<div class="col-6 col-sm-6 col-md-6 col-lg-6 col-xl-6" style="text-align: left;">
<button class="addButton" (click)="closeDialog()" mat-raised-button
style="margin:auto;color: #a34040;background-color: #faf2f2;">Close</button>
</div>
<div class="col-6 col-sm-6 col-md-6 col-lg-6 col-xl-6" style="text-align: right;">
<button class="addButton" (click)="saveNotificationText()" mat-raised-button style="margin:auto;">Save</button>
</div>
</div>
</ng-template>

@ -130,6 +130,10 @@ mat-table {
background-color: #ececec; background-color: #ececec;
color:#46AC9E; color:#46AC9E;
} }
.swal2-content {
font-family:nucleo;
font-weight: 900;
}
.table-content { .table-content {
padding: 5px; padding: 5px;
@ -193,7 +197,7 @@ input {
:host ::ng-deep { :host ::ng-deep {
.mat-form-field-infix { .mat-form-field-infix {
border-bottom: 0px solid white; border-bottom: 1px solid white;
} }
.mat-table { .mat-table {
@ -341,6 +345,13 @@ input {
font-size: small; font-size: small;
color: #4d2a00; color: #4d2a00;
} }
.canceledSpan{
background-color: #e39696;
border-radius: 10px;
font-size: small;
color: #4d1200;
}
.searchInputSpan{ .searchInputSpan{
background-color: #ececec; background-color: #ececec;
border-radius: 45px; border-radius: 45px;
@ -368,3 +379,225 @@ input {
transform: translate(-8px, -6px); transform: translate(-8px, -6px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
} }
.notificationButton{
padding: 0;
border-radius: 16px !important;
height: 35px !important;
// width: 68px !important;
float: center;
margin-top: 5px;
margin-bottom: 5px;
margin-right: 15px;
color: #424242;
background-color: white;
// height: 37px;
border-radius: 9px;
font-family: nucleo;
width: 11%;
// box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
// margin-right: 5px;
}
.notificationButton:hover{
background-color: #ebeaea ;
box-shadow: 0 2px rgb(129, 129, 129)a(0, 0, 0, 0.2);
// transform: translateY(5px);
}
@media screen and(max-width: 767px) {
.addButton{
width: 100px;
}
.notificationButton{
width: 100px;
}
}
// ------------------------------------------------
// .popup-card {
// position: fixed;
// background-color: #ffffff;
// top: 50%;
// left: 50%;
// transform: translate(-50%, -50%);
// width: 450px;
// height: 330px;
// z-index: 1000;
// }
// .popup-container {
// padding: 20px; /* Add padding for better spacing */
// display: flex;
// flex-direction: column;
// justify-content: center;
// height: 100%;
// }
// .mainCard{
// box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
// border-radius: 10px;
// }
// .resetSpan{
// font-family: texg;
// color: #1e3d3b;
// font-size: xx-large;
// float: center;
// margin-top: 15px;
// // margin-left: 64px;
// }
// .centered-form {
// display: flex;
// flex-direction: column;
// align-items: center;
// justify-content: center;
// }
// @media screen and (max-width: 600px) {
// .popup-card {
// width: 450px; /* Adjust card width for smaller screens */
// }
// }
// .mat-card-actions {
// display: flex;
// justify-content: flex-end;
// padding: 16px; /* Add padding for spacing */
// }
// .popUpButtons{
// padding: 5px;
// color: #353535;
// font-weight: 900;
// font-size: medium;
// // background-color: #ececec;
// font-family:nucleo;
// }
// .popUpButtons:hover{
// background-color: #ebeaea ;
// color:#46AC9E;
// box-shadow: 0 2px rgb(129, 129, 129)a(0, 0, 0, 0.2);
// // transform: translateY(5px);
// }
// .custom-spinner-content {
// font-size: 24px;
// color:#46AC9E;
// margin: 0;
// padding: 0;
// }
.popup-card {
position: fixed;
background-color: #ffffff;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 450px;
height: 330px;
z-index: 1000;
}
.popup-container {
padding: 20px; /* Add padding for better spacing */
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
}
.mainCard{
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
border-radius: 10px;
}
.resetSpan{
font-family: texg;
color: #1e3d3b;
font-size: xx-large;
float: center;
margin-top: 15px;
// margin-left: 64px;
}
h6{
font-family:nucleo;
}
.helpHeading{
font-family: texg;
color: #1e3d3b;
font-size: x-large;
float: center;
margin-top: 15px;
}
.centered-form {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
@media screen and (max-width: 600px) {
.popup-card {
width: 450px; /* Adjust card width for smaller screens */
}
}
.mat-card-actions {
display: flex;
justify-content: flex-end;
padding: 16px; /* Add padding for spacing */
}
.popUpButtons{
padding: 5px;
color: #353535;
font-weight: 900;
font-size: medium;
// background-color: #ececec;
font-family:nucleo;
}
.popUpButtons:hover{
background-color: #ebeaea ;
color:#46AC9E;
box-shadow: 0 2px rgb(129, 129, 129)a(0, 0, 0, 0.2);
// transform: translateY(5px);
}
.custom-spinner-content {
font-size: 24px;
color:#46AC9E;
margin: 0;
padding: 0;
}
.normalText{
font-family: nucleo;
}

@ -17,6 +17,10 @@ import { MasterService } from 'src/app/_providers/_services/master.service';
import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto'; import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto';
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service'; import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { MatDialog } from '@angular/material/dialog';
import { CommonDto } from 'src/app/_dto/common.dto';
import { error } from 'console';
import Swal from 'sweetalert2';
@Component({ @Component({
selector: 'app-dashboard', selector: 'app-dashboard',
@ -62,10 +66,31 @@ export class DashboardComponent implements OnInit {
@ViewChild(MatSort, { static: false }) sort: MatSort; @ViewChild(MatSort, { static: false }) sort: MatSort;
noData: boolean; noData: boolean;
userId: string; userId: string;
tenderId: number; tenderId: number;
countStatusP: any; countStatusP: any;
dialogRef: any;
commonData:CommonDto
// ------digital signature--------//
// showPopup:boolean = false;
// fileSelected: boolean;
// fileSelected2:boolean;
// Secretary:any;
// President:any;
// selectedSecretaryFile: any;
// selectedPresidentFile: any;
// SecretarySigned: boolean;
// PresidentSigned: boolean;
// -----------------------------//
constructor( constructor(
private _menuService: MenuService, private _menuService: MenuService,
private router: Router, private router: Router,
@ -76,6 +101,7 @@ export class DashboardComponent implements OnInit {
private errorService:ErrorTranslateService, private errorService:ErrorTranslateService,
private datePipe: DatePipe, private datePipe: DatePipe,
private route: ActivatedRoute, private route: ActivatedRoute,
private dialog: MatDialog
) { ) {
// this.user$ = this.getUser(); // this.user$ = this.getUser();
this.seculevel = localStorage.getItem('seculevel') this.seculevel = localStorage.getItem('seculevel')
@ -104,9 +130,11 @@ export class DashboardComponent implements OnInit {
async ngOnInit() { async ngOnInit() {
this.enableDownload = true; this.enableDownload = true;
this.commonData = new CommonDto()
this.getData(); this.getData();
this.paymentCheck() this.paymentCheck()
// this.fileSelected = false
// this.fileSelected2 = false
// await this._ui.userValidation() // await this._ui.userValidation()
// this.loading = true; // this.loading = true;
@ -129,6 +157,11 @@ export class DashboardComponent implements OnInit {
for(let element of res){ for(let element of res){
if(element.id == '56'){
element.hide56 = 'true'
}else
element.hide56= 'false'
const bidSubStartDate: Date = new Date(element.bidSubStartDate); const bidSubStartDate: Date = new Date(element.bidSubStartDate);
const bidSubEndDate: Date = new Date(element.bidSubEndDate); const bidSubEndDate: Date = new Date(element.bidSubEndDate);
@ -221,6 +254,19 @@ export class DashboardComponent implements OnInit {
} }
getMarqueeData(){
this.commonData.marquee = '';
this._masterService.getMasterData(apiUrl.common).then(res=>{
console.log('marquee==',res);
if(res && res.length > 0 && res[0].marquee && res[0].marquee != '' ){
this.commonData.marquee = res[0].marquee;
this.commonData.id = res[0].id
}
})
}
convertDateFormat(dateString: string): string { convertDateFormat(dateString: string): string {
const date = new Date(dateString); const date = new Date(dateString);
return this.datePipe.transform(date, 'yyyy-MM-ddTHH:mm'); return this.datePipe.transform(date, 'yyyy-MM-ddTHH:mm');
@ -230,7 +276,33 @@ export class DashboardComponent implements OnInit {
this.navigateTo('/add-tenders') this.navigateTo('/add-tenders')
} }
openNotificationDialog(templateRef){
this.dialogRef = this.dialog.open(templateRef, {
width: '500px',
disableClose: false
});
this.getMarqueeData();
}
closeDialog(){
this.dialogRef.close();
}
saveNotificationText(){
if(!this.commonData.marquee || this.commonData.marquee == ''){
this._ui.toastMessage(this.errorService.translate('notificationTextCannotBeBlank'));
return ;
}
else{
if(this.commonData.id){
this._masterService.updateMasterData(apiUrl.common,this.commonData,this.commonData.id).then(res=>{
this._ui.toastMessage(this.errorService.translate('notificationTextSaved'));
this.closeDialog();
})
}
}
}
sortData(sort: Sort) { sortData(sort: Sort) {
const data = this.tenderData.slice(); const data = this.tenderData.slice();
if (!sort.active || sort.direction === '') { if (!sort.active || sort.direction === '') {
@ -380,6 +452,7 @@ export class DashboardComponent implements OnInit {
} }
goToView(tenderId) { goToView(tenderId) {
this.router.navigate(['/tender-view',tenderId]); this.router.navigate(['/tender-view',tenderId]);
} }
@ -436,12 +509,185 @@ this._masterService.getMasterDatabyId(apiUrl.UserUploadCheck,`${this.userId}/${t
goToReport(id){ goToReport(id){
this.navigateTo(`bid-final-report/${id}`) this.navigateTo(`bid-final-report/${id}`)
} }
// CancelTender(id){
// this.showPopup = true;
// console.log(id);
// this.showPopup = true;
// }
// closePopup() {
// this.showPopup = false;
// this.Secretary =''
// this.President = ''
// }
// async UploadsecretaryFiles(event,SecretaryFile){
// const allowedExtensions = ['cer'];
// this.selectedSecretaryFile = event.target.files[0];
// if (this.selectedSecretaryFile) {
// const fileExtension = this.selectedSecretaryFile.name.split('.').pop();
// if (!allowedExtensions.includes(fileExtension)) {
// this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
// return;
// }
// this.Secretary = this.selectedSecretaryFile.name;
// const formData = new FormData();
// formData.append('adminUser', '2');
// formData.append('certificate', this.selectedSecretaryFile);
// console.log("s",formData);
// await this._masterService.saveMasterData(apiUrl.digitalSignature,formData).then((res) =>{
// console.log(res);
// if(res.message = "Authentication Successfully Completed"){
// console.log("1");
// this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
// this.SecretarySigned = true
// }else{
// this.SecretarySigned = false
// }
// },(err) => {
// if(err.status === 201){
// this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
// this.SecretarySigned = true
// }
// if (err.status === 500) {
// this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
// }
// if(err.status === 400){
// this._ui.toastMessage(this.errorService.translate('KeyNotMatchingPleaseTryAgain'), 3000);
// this.SecretarySigned = false
// }
// })
// }
// }
// deleteSecretaryInput(){
// }
// async UploadPresidentFiles(event,President){
// const allowedExtensions = ['cer'];
// this.selectedPresidentFile = event.target.files[0];
// if (this.selectedPresidentFile) {
// const fileExtension = this.selectedPresidentFile.name.split('.').pop();
// if (!allowedExtensions.includes(fileExtension)) {
// this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
// return;
// }
// this.President = this.selectedPresidentFile.name;
// const formData = new FormData();
// formData.append('adminUser', '1');
// formData.append('certificate', this.selectedPresidentFile);
// console.log("p",formData);
// await this._masterService.saveMasterData(apiUrl.digitalSignature,formData).then((res) =>{
// console.log(res);
// if(res.message = "Authentication Successfully Completed"){
// console.log("1");
// this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
// this.PresidentSigned = true
// }else{
// this.PresidentSigned = false
// }
// },(err) => {
// if(err.status === 201){
// this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
// this.PresidentSigned = true
// }
// if (err.status === 500) {
// this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
// }
// if(err.status === 400){
// this._ui.toastMessage(this.errorService.translate('KeyNotMatchingPleaseTryAgain'), 3000);
// this.SecretarySigned = false
// }
// })
// }
// }
// deletePresidentInput(){
// }
// VerifySignature(){
// this.showPopup = true;
// if(this.Secretary == null || this.Secretary == '' || this.Secretary == undefined){
// this._ui.toastMessage(this.errorService.translate('secretarySignatureCantBeBlank'), 3000);
// return false
// }else if(this.President == null || this.President == '' || this.President == undefined){
// this._ui.toastMessage(this.errorService.translate('PresidentSignatureCantBeBlank'), 3000);
// return false
// }else if(!this.SecretarySigned && !this.PresidentSigned){
// Swal.fire({
// icon: 'error',
// title: 'Oops...',
// text: 'Something went wrong!',
// // footer: '<a href="">Why do I have this issue?</a>'
// })
// return false
// //this._ui.toastMessage(this.errorService.translate('verificationFailed'), 3000);
// }else if(this.SecretarySigned && this.PresidentSigned){
// console.log("OK");
// Swal.fire({
// icon: 'success',
// title: 'Cancellation Successfully',
// showConfirmButton: false,
// timer: 1500
// })
// this.showPopup = false;
// }
// }
// openHelpDialog(templateRef) {
// this.dialogRef = this.dialog.open(templateRef, {
// width: '700px',
// disableClose: false
// });
// }

@ -41,17 +41,130 @@
<!-- <mat-progress-bar mode="indeterminate" color="warn"></mat-progress-bar> --> <!-- <mat-progress-bar mode="indeterminate" color="warn"></mat-progress-bar> -->
<br id="headingBreak"> <br id="headingBreak">
<div class="text-center mt-4"> <div class="text-center mt-4">
<h2 class="tenderHeading" >Tender Details </h2> <h2 class="tenderHeading">Tender Details</h2>
<div class="row responsive"> <div class="row">
<div class="col-3"></div> <div class="col-11 text-right">
<div class="col-3"></div> <div class="responsive-buttons">
<div class="col-5 "> <button *ngIf="seculevel === 'B'" (click)="TenderCancelToggle($event)" class="hide-on-print printButton float-left responsive" mat-raised-button>
<button class="hide-on-print printButton" mat-raised-button (click)="print()">Print <i class="fa fa-arrow-down" style="font-size: small;"></i></button>&nbsp; Active <mat-slide-toggle [checked]="activeYn === 'Y'" disabled style="margin-bottom: 4px; font-family: nucleo;" matTooltip="Slide to Enable / Disable Tender" (change)="TenderCancelToggle($event)"></mat-slide-toggle>
</button>
<button *ngIf="!CancelTenderButtons" class="hide-on-print printButton float-left responsive" mat-raised-button (click)="print()">
Print <i class="fa fa-arrow-down" style="font-size: small;"></i>
</button>
</div>
</div> </div>
<div class="col-1 "></div> </div>
</div>
<br>
<mat-card *ngIf="showPopup" class="popup-card mainCard">
<br>
<div class="popup-container">
<mat-card-subtitle style="text-align: center;">
<div class="row">
<div class="col-12">
<span class="resetSpan">{{ 'digitalSignature' | translate }}</span>
<div class="float-right">
<a style="cursor: pointer;color: rgb(0, 0, 0); " class="normalText" (click)="openHelpDialog(help)" ><h5><i class="bi bi-info-circle"></i></h5></a>
</div>
</div>
</div>
</mat-card-subtitle><br>
<mat-card-content class="centered-form">
<mat-form-field class="columns" appearance="outline" style="width: 90%;">
<mat-label style=" font-family: nucleo;" *ngIf="Secretary; else SecretarySignature">
{{Secretary}}</mat-label>
<ng-template #SecretarySignature>
<mat-label style=" font-family: nucleo;"> {{ 'SecretarySignature' | translate }}
</mat-label>
</ng-template>
<input matInput readonly [(ngModel)]="Secretary">
<button mat-icon-button matSuffix *ngIf="!this.fileSelected"
(click)="assetFileInput.click();">
<mat-icon>attach_file</mat-icon>
</button>
<!-- <button mat-icon-button matSuffix *ngIf="this.fileSelected" (click)="deleteSecretaryInput();">
<mat-icon>delete</mat-icon>
</button> -->
<input hidden (change)="UploadsecretaryFiles($event,Secretary)" #assetFileInput
type="file" id="file" value="Secretary">
</mat-form-field>
<mat-form-field appearance="outline" style="width: 90%;">
<mat-label style=" font-family: nucleo;" *ngIf="President; else PresidentSignature">
{{President}}</mat-label>
<ng-template #PresidentSignature>
<mat-label style=" font-family: nucleo;"> {{ 'PresidentSignature' | translate }}
</mat-label>
</ng-template>
<input matInput readonly [(ngModel)]="President" >
<button mat-icon-button matSuffix *ngIf="!this.fileSelected2"
(click)="assetFileInput2.click();">
<mat-icon>attach_file</mat-icon>
</button>
<!-- <button mat-icon-button matSuffix *ngIf="this.fileSelected2" (click)="deletePresidentInput();">
<mat-icon>delete</mat-icon>
</button> -->
<input hidden (change)="UploadPresidentFiles($event,President)" #assetFileInput2
type="file" id="file2" value="President">
</mat-form-field>
</mat-card-content>
<mat-card-actions class="float-right">
<button mat-button (click)="VerifySignature()" class="popUpButtons">Verify</button>
<button mat-button (click)="closePopup()" class="popUpButtons">Close</button>
</mat-card-actions>
</div> </div>
</div><br>
<ng-template #help>
<div class="normalText">
<div class="row" style="text-align: center;">
<div class="col-12">
<span class="helpHeading">How can I Validate Digital Signature? </span>
</div>
</div>
<br>
<br>
<h6> Connect Security Device
</h6>
<ul>
<li> Plug in the security device that has the necessary security keys.
</li>
</ul>
<h6> Select Key Files
</h6>
<ul>
<li> Choose the Public key files for both the secretary and the president, usually provided on the security device.
</li>
<li>Locate the Public key document or file that you want to validate.</li>
</ul>
<div class="row" style="text-align: center;">
<div class="col-12" >
<span style="font-family: nucleo;font-size: larger; color: #1e3d3b;">You can access Tender Reports only after validating the digital signatures of President and Secretary.</span>
</div>
</div>
<div style="text-align: right;">
<a style="color: #46AC9E;cursor: pointer;" (click)="closeDialog()">Close</a>
</div>
</div>
</ng-template>
</mat-card>
<div class="row d-flex justify-content-center "> <div class="row d-flex justify-content-center ">
@ -131,7 +244,7 @@
</tr> </tr>
<tr class="hide-on-print"> <tr class="hide-on-print">
<!-- <th>Fee Payable At</th> --> <!-- <th>Fee Payable At</th> -->
<th colspan="2"> <button class="float-right hide-on-print payButton" *ngIf="!amountPaid && seculevel != 'B' && OnlinePayment" mat-raised-button (click)="paymentGateway()">Pay Tender Fee</button></th> <th colspan="2"> <button class="float-right hide-on-print payButton" *ngIf="!amountPaid && seculevel != 'B' && OnlinePayment && !CancelTenderButtons" mat-raised-button (click)="paymentGateway()">Pay Tender Fee</button></th>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -349,7 +462,7 @@
</tr> </tr>
<tr class="hide-on-print"> <tr class="hide-on-print">
<th colspan="12"><button *ngIf="showDownloadButton" mat-raised-button id="zipFile" (click)="downloadWITZip()" class=" DownloadZipButton hide-on-print" <th colspan="12"><button *ngIf="showDownloadButton && !CancelTenderButtons" mat-raised-button id="zipFile" (click)="downloadWITZip()" class=" DownloadZipButton hide-on-print"
> <i class="bi bi-file-earmark-zip"></i> Download as Zip File</button> > <i class="bi bi-file-earmark-zip"></i> Download as Zip File</button>
<p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p> <p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p>
@ -383,7 +496,7 @@
<tr class="hide-on-print"> <tr class="hide-on-print">
<th colspan="12">Description<button *ngIf="showDownloadButton" mat-raised-button id="zipFile" class="DownloadZipButton hide-on-print" <th colspan="12">Description<button *ngIf="showDownloadButton && !CancelTenderButtons" mat-raised-button id="zipFile" class="DownloadZipButton hide-on-print"
(click)="DownloadDrawingsZIP()" > <i class="bi bi-file-earmark-zip"></i> Download as Zip (click)="DownloadDrawingsZIP()" > <i class="bi bi-file-earmark-zip"></i> Download as Zip
File</button> File</button>
<p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p> <p *ngIf="!showDownloadButton">Documents can Only be download between {{tenderData.saleStartDate | date: 'MMM d, y, h:mm:ss a'}} and {{tenderData.saleEndDate| date: 'MMM d, y, h:mm:ss a'}}</p>

@ -108,7 +108,7 @@ mat-table {
color: #353535; color: #353535;
} }
.printButton { .printButton {
float: right; // float: right;
margin-top: 5px; margin-top: 5px;
margin-bottom: 5px; margin-bottom: 5px;
background-color: white; background-color: white;
@ -189,3 +189,160 @@ mat-table {
font-size: 12px; font-size: 12px;
} }
} }
// ---------------------------------------digital signature------------------------------------------//
::ng-deep .mat-slide-toggle.mat-checked .mat-slide-toggle-bar {
background-color: #0bbb86; /* Primary color */
//cursor: pointer;
}
::ng-deep .mat-slide-toggle .mat-tooltip.tooltip{
font-family: nucleo;
}
::ng-deep .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb {
background-color: #00ffaa; /* Accent color */
cursor: pointer;
}
::ng-deep .mat-slide-toggle-label {
display: flex;
flex: 1;
flex-direction: row;
align-items: center;
height: inherit;
cursor: pointer;
}
.element-with-tooltip {
cursor: pointer; /* Set the cursor style to pointer for the element */
}
.popup-card {
position: fixed;
background-color: #ffffff;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 450px;
height: 330px;
z-index: 1000;
}
.popup-container {
padding: 20px; /* Add padding for better spacing */
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
}
.mainCard{
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
border-radius: 10px;
}
.resetSpan{
font-family: texg;
color: #1e3d3b;
font-size: xx-large;
float: center;
margin-top: 15px;
// margin-left: 64px;
}
h6{
font-family:nucleo;
}
.helpHeading{
font-family: texg;
color: #1e3d3b;
font-size: x-large;
float: center;
margin-top: 15px;
}
.centered-form {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
@media screen and (max-width: 600px) {
.popup-card {
width: 450px; /* Adjust card width for smaller screens */
}
}
.mat-card-actions {
display: flex;
justify-content: flex-end;
padding: 16px; /* Add padding for spacing */
}
.popUpButtons{
padding: 5px;
color: #353535;
font-weight: 900;
font-size: medium;
// background-color: #ececec;
font-family:nucleo;
}
.popUpButtons:hover{
background-color: #ebeaea ;
color:#46AC9E;
box-shadow: 0 2px rgb(129, 129, 129)a(0, 0, 0, 0.2);
// transform: translateY(5px);
}
.custom-spinner-content {
font-size: 24px;
color:#46AC9E;
margin: 0;
padding: 0;
}
.normalText{
font-family: nucleo;
}
.responsive-buttons {
display: flex;
justify-content: flex-end;
align-items: center;
}
.responsive-buttons button {
margin-left: 10px; /* Add some spacing between the buttons */
}
@media (max-width: 768px) {
.responsive-buttons {
flex-direction: row;
justify-content: flex-end;
align-items: center;
}
}

@ -1,4 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { PurchaseDto } from 'src/app/_dto/purchase.dto'; import { PurchaseDto } from 'src/app/_dto/purchase.dto';
import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto'; import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto';
@ -9,6 +10,7 @@ import { MasterService } from 'src/app/_providers/_services/master.service';
import { TransactionService } from 'src/app/_providers/_services/transaction.service'; import { TransactionService } from 'src/app/_providers/_services/transaction.service';
import { UiService } from 'src/app/_providers/_services/ui.service'; import { UiService } from 'src/app/_providers/_services/ui.service';
import { environment } from 'src/environments/environment.prod'; import { environment } from 'src/environments/environment.prod';
import Swal from 'sweetalert2';
@Component({ @Component({
selector: 'app-home-view', selector: 'app-home-view',
@ -51,15 +53,36 @@ export class HomeViewComponent implements OnInit {
OnlinePayment: boolean; OnlinePayment: boolean;
showDownloadButton: boolean; showDownloadButton: boolean;
// ------digital signature--------//
showPopup:boolean = false;
fileSelected: boolean;
fileSelected2:boolean;
Secretary:any;
President:any;
selectedSecretaryFile: any;
selectedPresidentFile: any;
SecretarySigned: boolean;
PresidentSigned: boolean;
activeYn: any;
dialogRef: any;
newStatus: string;
CancelTenderButtons: boolean;
// -------------- ---------------//
constructor( constructor(
private router: Router, private router: Router,
private route: ActivatedRoute, private route: ActivatedRoute,
private _masterService: MasterService, private _masterService: MasterService,
private _transactionService: TransactionService, private _transactionService: TransactionService,
private errorService:ErrorTranslateService,
private _ui: UiService, private _ui: UiService,
private _errorTranslateService: ErrorTranslateService private _errorTranslateService: ErrorTranslateService,
private dialog: MatDialog
) { ) {
this.seculevel = localStorage.getItem('seculevel')
this.tenderId = +this.route.snapshot.paramMap.get('id'); this.tenderId = +this.route.snapshot.paramMap.get('id');
this.paymentStatus = this.route.snapshot.paramMap.get('pay'); this.paymentStatus = this.route.snapshot.paramMap.get('pay');
this.getData() this.getData()
@ -74,6 +97,9 @@ export class HomeViewComponent implements OnInit {
this.enableDownload = true; this.enableDownload = true;
this.getData(); this.getData();
this.getPaymentData(); this.getPaymentData();
this.fileSelected = false
this.fileSelected2 = false
} }
@ -91,9 +117,13 @@ export class HomeViewComponent implements OnInit {
this.tenderData = res this.tenderData = res
this.tenderDocuments = this.tenderData['tenderDoc'] this.tenderDocuments = this.tenderData['tenderDoc']
this.activeYn = this.tenderData['activeYn'];
// console.log("paymentModeD",res.paymentModeD.paymentMode); console.log("paymentModeD",res);
if(this.activeYn == 'N'){
this.CancelTenderButtons = true
}else if(this.activeYn == 'Y'){
this.CancelTenderButtons = false
}
if(this.tenderData.paymentModeD.paymentMode == 'Online'){ if(this.tenderData.paymentModeD.paymentMode == 'Online'){
this.OnlinePayment = true this.OnlinePayment = true
@ -327,4 +357,239 @@ export class HomeViewComponent implements OnInit {
this._ui.toastMessage(err.message ? err.message : this._errorTranslateService.translate('errInSave'), 3000); this._ui.toastMessage(err.message ? err.message : this._errorTranslateService.translate('errInSave'), 3000);
} }
// -------------------------------------------------------------------------------------------
CancelTender(id){
this.showPopup = true;
console.log(id);
this.showPopup = true;
}
closePopup() {
this.showPopup = false;
this.Secretary =''
this.President = ''
}
async UploadsecretaryFiles(event,SecretaryFile){
const allowedExtensions = ['cer'];
this.selectedSecretaryFile = event.target.files[0];
if (this.selectedSecretaryFile) {
const fileExtension = this.selectedSecretaryFile.name.split('.').pop();
if (!allowedExtensions.includes(fileExtension)) {
this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
return;
}
this.Secretary = this.selectedSecretaryFile.name;
const formData = new FormData();
formData.append('adminUser', '2');
formData.append('certificate', this.selectedSecretaryFile);
console.log("s",formData);
await this._masterService.saveMasterData(apiUrl.digitalSignature,formData).then((res) =>{
console.log(res);
if(res.message = "Authentication Successfully Completed"){
console.log("1");
this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.SecretarySigned = true
}else{
this.SecretarySigned = false
}
},(err) => {
if(err.status === 201){
this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.SecretarySigned = true
}
if (err.status === 500) {
this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
}
if(err.status === 400){
this._ui.toastMessage(this.errorService.translate('KeyNotMatchingPleaseTryAgain'), 3000);
this.SecretarySigned = false
this.Secretary =''
}
if(err.status === 401){
this._ui.toastMessage(this.errorService.translate('Digital Signature Expired'), 3000);
this.SecretarySigned = false
this.Secretary =''
}
})
}
}
deleteSecretaryInput(){
}
async UploadPresidentFiles(event,President){
const allowedExtensions = ['cer'];
this.selectedPresidentFile = event.target.files[0];
if (this.selectedPresidentFile) {
const fileExtension = this.selectedPresidentFile.name.split('.').pop();
if (!allowedExtensions.includes(fileExtension)) {
this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
return;
}
this.President = this.selectedPresidentFile.name;
const formData = new FormData();
formData.append('adminUser', '1');
formData.append('certificate', this.selectedPresidentFile);
console.log("p",formData);
await this._masterService.saveMasterData(apiUrl.digitalSignature,formData).then((res) =>{
console.log(res);
if(res.message = "Authentication Successfully Completed"){
console.log("1");
this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.PresidentSigned = true
}else{
this.PresidentSigned = false
}
},(err) => {
if(err.status === 201){
this._ui.toastMessage(this.errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.PresidentSigned = true
}
if (err.status === 500) {
this._ui.toastMessage(this.errorService.translate('invalidFileFormat'), 3000);
}
if(err.status === 400){
this._ui.toastMessage(this.errorService.translate('KeyNotMatchingPleaseTryAgain'), 3000);
this.PresidentSigned = false
this.President = ''
}
if(err.status === 401){
this._ui.toastMessage(this.errorService.translate('Digital Signature Expired'), 3000);
this.PresidentSigned = false
this.President = ''
}
})
}
}
deletePresidentInput(){
}
TenderCancelToggle(event){
this.showPopup = true;
}
VerifySignature(){
const id = this.tenderId;
this.showPopup = true;
if(this.Secretary == null || this.Secretary == '' || this.Secretary == undefined){
this._ui.toastMessage(this.errorService.translate('secretarySignatureCantBeBlank'), 3000);
return false
}else if(this.President == null || this.President == '' || this.President == undefined){
this._ui.toastMessage(this.errorService.translate('PresidentSignatureCantBeBlank'), 3000);
return false
}else if(!this.SecretarySigned && !this.PresidentSigned){
Swal.fire({
icon: 'error',
title: 'Oops...',
text: 'Something went wrong!',
// footer: '<a href="">Why do I have this issue?</a>'
})
return false
//this._ui.toastMessage(this.errorService.translate('verificationFailed'), 3000);
}else if(this.SecretarySigned && this.PresidentSigned){
console.log("OK");
this.activeYn = this.activeYn === 'N' ? 'Y' : 'N';
console.log( this.activeYn);
let body ={
activeYn: this.activeYn
}
this._masterService.postMasterData(apiUrl.TenderStatus,body,id).then((res) =>{
console.log(res);
if(this.activeYn == 'N'){
this.activeYn == 'N'
}else if(this.activeYn == 'Y'){
this.activeYn == 'Y'
}
this._ui.toastMessage(res.data, 3000);
if(res.data == 'Digital Signature Expired'){
this.activeYn == 'N'
}
this.closePopup()
},
(err) => {
console.error(err);
this._ui.toastMessage(err.error.message, 3000);
}
);
this.showPopup = false;
}
}
openHelpDialog(templateRef) {
this.dialogRef = this.dialog.open(templateRef, {
width: '700px',
disableClose: false
});
}
closeDialog(){
this.dialogRef.close();
}
} }

@ -195,7 +195,7 @@
[ngModelOptions]="{standalone: true}" (ngModelChange)="onPaymentStatusChange(element.userId, element.paymentStatus)"> [ngModelOptions]="{standalone: true}" (ngModelChange)="onPaymentStatusChange(element.userId, element.paymentStatus)">
<mat-option *ngIf="element.status === 'P';" style="font-family: nucleo;" value="P">Pending</mat-option> <mat-option *ngIf="element.status === 'P';" style="font-family: nucleo;" value="P">Pending</mat-option>
<mat-option style="font-family: nucleo;" value="D">Decline</mat-option> <mat-option style="font-family: nucleo;" value="D">Decline</mat-option>
<mat-option style="font-family: nucleo;" value="S">Confirm</mat-option> <mat-option style="font-family: nucleo;" value="S" (click)="ConfirmMail(element.userName, element.email)" >Confirm</mat-option>
</mat-select> </mat-select>

@ -104,11 +104,18 @@ export class PaymentDetailsComponent implements OnInit {
sortData(sort: Sort) {} sortData(sort: Sort) {}
onPaymentStatusChange(userId, paymentStatus){ onPaymentStatusChange(userId, paymentStatus){
console.log("this.paymentStatus",paymentStatus); console.log("this.paymentStatus",paymentStatus);
let message = '';
if (paymentStatus === 'S') {
message = 'Payment confirmed message';
} else if (paymentStatus === 'D') {
message = 'Payment declined message';
}
let body = { let body = {
status : paymentStatus status : paymentStatus,
notificationViewed:'N',
message:message
} }
this._masterService.postMasterData(apiUrl.paymentupdatePaymentStatus,body,`${userId}/${this.tenderId}`).then((res) =>{ this._masterService.postMasterData(apiUrl.paymentupdatePaymentStatus,body,`${userId}/${this.tenderId}`).then((res) =>{
console.log(res); console.log(res);
@ -121,4 +128,18 @@ export class PaymentDetailsComponent implements OnInit {
}) })
} }
ConfirmMail(userName,email){
// console.log("this is for userName",userName);
// console.log("this is for email",email);
let body ={
custName:userName,
email: email
}
this._masterService.saveMasterData(apiUrl.confirmPayment,body).then((res) =>{
console.log(res);
})
}
} }

@ -1,30 +1,33 @@
<br> <!-- <br>
<br> <br>
<div [hidden]="!qrImage" style="text-align: center;"> <div [hidden]="!qrImage" style="text-align: center;">
<p>Payment Status : &nbsp; <b>{{paymentStatus}}</b></p> <p class="normalText">Current payment status : &nbsp; <span class="statusSpan">{{paymentStatus}}</span></p>
<br>
<p class="normalText">Amount need to be paid : <span class="noFont">&nbsp;₹{{amountReq}}/- Only</span></p>
<br> <br>
<p>Amount need to be paid : &nbsp;₹{{amountReq}}/- Only</p> <p class="payUpimsg">Pay using any UPI app</p>
<img id="qrImage" alt="QR Code" > <img id="qrImage" alt="QR Code" >
</div> </div>
<br> <br>
<div class="row"> <div class="row">
<div class="col-1 col-sm-1 col-md-3 col-lg-3 col-xl-3"></div> <div class="col-1 col-sm-1 col-md-3 col-lg-3 col-xl-3"></div>
<div class="col-10 col-sm-10 col-md-6 col-lg-6 col-xl-6"> <div class="col-10 col-sm-10 col-md-6 col-lg-6 col-xl-6">
<p>Please provide the transaction id of payment you've made successfully.</p> <p class="normalText">Please provide the transaction id of payment you've made successfully.</p>
<mat-form-field class="input-style" appearance="outline" style="width:100%;"> <mat-form-field class="input-style" appearance="outline" style="width:100%;">
<mat-label >Transaction ID </mat-label> <mat-label class="normalText">Transaction ID </mat-label>
<input matInput placeholder="Enter Transaction ID" type="text" [(ngModel)]="transactionData.transId"/> <input matInput class="normalText" placeholder="Enter Transaction ID" type="text" [(ngModel)]="transactionData.transId"/>
</mat-form-field> </mat-form-field>
<div style="text-align: center;"> <div style="text-align: center;">
<button mat-raised-button (click)="submit()" [disabled]="paymentStatus == 'Success'">Submit</button> <button mat-raised-button class="normalText" (click)="submit()" [disabled]="paymentStatus == 'Success'">Submit</button>
</div> </div>
<div style="text-align: right;"> <div style="text-align: right;">
<a style="cursor: pointer;color: blue;" (click)="openHelpDialog(help)">help?</a> <a style="cursor: pointer;color: blue;" class="normalText" (click)="openHelpDialog(help)">help?</a>
</div> </div>
</div> </div>
<div class="col-1 col-sm-1 col-md-3 col-lg-3 col-xl-3"></div> <div class="col-1 col-sm-1 col-md-3 col-lg-3 col-xl-3"></div>
@ -35,7 +38,7 @@
<ng-template #help> <ng-template #help>
<div> <div class="normalText">
<h6>How can I pay? </h6> <h6>How can I pay? </h6>
<ul> <ul>
<li>Launch the payment app on your smartphone</li> <li>Launch the payment app on your smartphone</li>
@ -62,4 +65,129 @@
<a style="color: #46AC9E;cursor: pointer;" (click)="closeDialog()">Close</a> <a style="color: #46AC9E;cursor: pointer;" (click)="closeDialog()">Close</a>
</div> </div>
</div> </div>
</ng-template> </ng-template> -->
<!-- ------------------------------------------------- -->
<br>
<br>
<div class="center-container">
<mat-card class="popup-card">
<mat-card-subtitle style="text-align: center;">
<div class="row">
<div class="col-3"></div>
<div class="col-6">
<span class="resetSpan">{{ 'QRpayment' | translate }}</span>
</div>
<div class="col-3">
<div class="float-right">
<a style="cursor: pointer;color: blue;" class="normalText" (click)="openHelpDialog(help)">help?</a>
</div>
</div>
</div>
</mat-card-subtitle>
<mat-card-content class="centered-form">
<mat-tab-group class="custom-tab-group" color="warn">
<mat-tab label="Step 1" [disabled]="true"><br>
<div [hidden]="!qrImage" style="text-align: center;">
<p class="normalText">Current payment status : &nbsp; <span
class="statusSpan">{{paymentStatus}}</span></p>
<p class="normalText">Amount need to be paid : <span class="noFont">&nbsp;₹{{amountReq}}/-
Only</span></p>
<p class="payUpimsg">Pay using any UPI app</p>
<img id="qrImage" alt="QR Code">
</div>
<div class="row">
<div class="col-1 col-sm-1 col-md-3 col-lg-3 col-xl-3"></div>
<div class="col-10 col-sm-10 col-md-6 col-lg-6 col-xl-6">
<!-- ... Rest of the content ... -->
</div>
<div class="col-1 col-sm-1 col-md-3 col-lg-3 col-xl-3">
<div class="float-left">
<button class="btn btn-light float-right font-weight-bold" type="button"
(click)="nextTab()">Next<i class="bi bi-arrow-right-circle"></i>
</button>
</div>
</div>
</div>
</mat-tab>
<mat-tab label="Step 2" [disabled]="true">
<br>
<br>
<div class="centered-form-content">
<p class="normalTextIN">Please provide the transaction id of payment you've made successfully.</p>
<br>
<mat-form-field class="form-group" appearance="outline" style="width:80%;">
<mat-label class="normalText">Please Enter Transaction ID</mat-label>
<input matInput class="normalText" placeholder="Enter Transaction ID" type="text"
[(ngModel)]="transactionData.transId" />
</mat-form-field>
<div class="centered-button">
<div class="col-md-3 col-12">
<button class="btn btn-light float-md-left font-weight-bold" (click)="prevTab()">
<i class="bi bi-arrow-left-circle"></i> Prev
</button>
</div>
<div class="col-md-6 col-12">
<button mat-raised-button class="btn1" (click)="submit()"
[disabled]="paymentStatus == 'Success'">Submit</button>
</div>
<div class="col-md-3 col-12"></div>
</div>
</div>
<ng-template #help>
<div class="normalText">
<h6>How can I pay? </h6>
<ul>
<li>Launch the payment app on your smartphone</li>
<li>scan the code</li>
<li>After paying need to enter transaction ID for Completing the process </li>
<li>Review the payment details to ensure they're correct, and then confirm the transaction
</li>
</ul>
<h6>How do I get my Transaction Id? </h6>
<ul>
<li>The method to obtain a transaction ID for a QR code payment can vary depending on the
payment app you're using and the platform through which you made the payment. Generally,
when you make a payment using a QR code, the transaction ID is usually generated and
provided to you as a confirmation of the completed payment. please check your payment
app or mail for Transaction ID</li>
</ul>
<h6>How can I ensure that the payment was successful?</h6>
<ul>
<li>After your successfull payment,enter the transaction Id</li>
<li>After the confirmation from Bank, your payment status will be changed from Pending to
Paid</li>
</ul>
<h6>Can I change the Transaction ID once it has been saved?</h6>
<ul>
<li>You can edit the transaction ID after saving also</li>
<li>Editing Must be before the appropriate date</li>
</ul>
<p>more info : tscb178@gmail.com</p>
<div style="text-align: right;">
<a style="color: #46AC9E;cursor: pointer;" (click)="closeDialog()">Close</a>
</div>
</div>
</ng-template>
</mat-tab>
</mat-tab-group>
</mat-card-content>
</mat-card>
</div>

@ -1,6 +1,156 @@
.payUpimsg{
font-family: texg;
margin-bottom: 0px;
}
.statusSpan{
font-weight: bolder;
font-family: nucleo;
font-size: large;
}
.normalText{
font-family: nucleo;
}
.btn1{
font-family: nucleo;
font-size: 1rem;
}
h6{
font-family: nucleo;
}
.noFont{
font-family: sans-serif;
font-weight: 600;
}
// -[-----------------------------------------------------------------]-
.btn:hover, .btn1:hover {
background-color: #ebeaea;
color: #46AC9E;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.popup-card {
background-color: #ffffff;
width: 100%;
max-width: 600px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
border-radius: 10px;
}
.resetSpan{
font-family: texg;
color: #1e3d3b;
font-size: xx-large;
float: center;
margin-top: 15px;
// margin-left: 64px;
}
// .centered-form {
// display: flex;
// flex-direction: column;
// align-items: center;
// justify-content: center;
// }
::ng-deep .custom-tab-group .mat-tab-label {
// color: rgb(0, 0, 0);
text-transform: none;
min-width: auto;
padding: 5px;
color: #505050;
font-weight: 700;
font-size: 1rem;
padding: 10px;
font-family: nucleo;
width: 270px;
.md-dialog-container {
background-color: #000;
width: 600px;
height: 600px
} }
.normalTextIN{
color: #505050;
font-weight: 700;
font-size: small;
font-family: nucleo;
font-size: 1rem;
}
.centered-heading {
text-align: center;
margin-bottom: 20px;
}
.centered-form-content {
text-align: center;
padding: 0 20px;
}
.centered-button {
text-align: center;
display: flex;
justify-content: center;
align-items: center;
margin-top: 20px;
}
::ng-deep .mat-form-field-flex{
background-color: #f0f0f0;
}
@media screen and (max-width: 600px) {
.centered-heading {
font-size: 1.2rem;
}
}
@media (max-width: 767px) {
.responsive-container {
padding: 10px;
}
.custom-tab-group {
width: 100%;
}
.centered-form-content {
padding: 10px;
}
.col-md-3,
.col-md-6 {
flex-basis: 100%;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.col-md-3,
.col-md-6 {
flex-basis: 50%;
}
}
.center-container {
display: flex;
justify-content: center; /* Horizontally center */
// align-items: center; /* Vertically center */
// height: 100vh; /* Make the container cover the viewport vertically */
// background-color: rgba(0, 0, 0, 0.5); /* Optional overlay background */
}

@ -1,6 +1,7 @@
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { MatTabGroup } from '@angular/material/tabs';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import * as QRCode from 'qrcode'; import * as QRCode from 'qrcode';
import { PaymentInfoDto } from 'src/app/_dto/payment-info.dto'; import { PaymentInfoDto } from 'src/app/_dto/payment-info.dto';
@ -33,6 +34,8 @@ export class QrPaymentComponent implements OnInit {
paymentId: any; paymentId: any;
@ViewChild(MatTabGroup) tabGroup: MatTabGroup;
constructor( constructor(
private router: Router, private router: Router,
private route: ActivatedRoute, private route: ActivatedRoute,
@ -126,6 +129,25 @@ export class QrPaymentComponent implements OnInit {
this.dialogRef.close() this.dialogRef.close()
} }
nextTab() {
// console.log("dtaa=",this.tenderData);
const selectedIndex = this.tabGroup.selectedIndex;
const tabCount = this.tabGroup._tabs.length;
if (selectedIndex < tabCount - 1) {
this.tabGroup.selectedIndex = selectedIndex + 1;
}
}
prevTab() {
// console.log("dtaa=",this.tenderData);
const selectedIndex = this.tabGroup.selectedIndex;
if (selectedIndex > 0) {
this.tabGroup.selectedIndex = selectedIndex - 1;
}
}
preSave() { preSave() {
if (this.transactionData.transId == 0 || this.transactionData.transId == null || this.transactionData.transId == undefined) { if (this.transactionData.transId == 0 || this.transactionData.transId == null || this.transactionData.transId == undefined) {

@ -1,4 +1,113 @@
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0" />
<mat-card *ngIf="showPopup" class="popup-card mainCard">
<br>
<div class="popup-container">
<mat-card-subtitle style="text-align: center;">
<div class="row">
<div class="col-12">
<span class="resetSpan">{{ 'digitalSignature' | translate }}</span>
<div class="float-right">
<a style="cursor: pointer;color: rgb(0, 0, 0); " class="normalText" (click)="openHelpDialog(help)"><h5><i class="bi bi-info-circle"></i></h5></a>
</div>
</div>
</div>
</mat-card-subtitle><br>
<mat-card-content class="centered-form">
<mat-form-field class="columns" appearance="outline" style="width: 90%;">
<mat-label style=" font-family: nucleo;" *ngIf="Secretary; else SecretarySignature">
{{Secretary}}</mat-label>
<ng-template #SecretarySignature>
<mat-label style=" font-family: nucleo;"> {{ 'SecretarySignature' | translate }}
</mat-label>
</ng-template>
<input matInput readonly [(ngModel)]="Secretary">
<button mat-icon-button matSuffix *ngIf="!this.fileSelected"
(click)="assetFileInput.click();">
<mat-icon>attach_file</mat-icon>
</button>
<!-- <button mat-icon-button matSuffix *ngIf="this.fileSelected" (click)="deleteSecretaryInput();">
<mat-icon>delete</mat-icon>
</button> -->
<input hidden (change)="UploadsecretaryFiles($event,Secretary)" #assetFileInput
type="file" id="file" value="Secretary">
</mat-form-field>
<mat-form-field appearance="outline" style="width: 90%;">
<mat-label style=" font-family: nucleo;" *ngIf="President; else PresidentSignature">
{{President}}</mat-label>
<ng-template #PresidentSignature>
<mat-label style=" font-family: nucleo;"> {{ 'PresidentSignature' | translate }}
</mat-label>
</ng-template>
<input matInput readonly [(ngModel)]="President" >
<button mat-icon-button matSuffix *ngIf="!this.fileSelected2"
(click)="assetFileInput2.click();">
<mat-icon>attach_file</mat-icon>
</button>
<!-- <button mat-icon-button matSuffix *ngIf="this.fileSelected2" (click)="deletePresidentInput();">
<mat-icon>delete</mat-icon>
</button> -->
<input hidden (change)="UploadPresidentFiles($event,President)" #assetFileInput2
type="file" id="file2" value="President">
</mat-form-field>
</mat-card-content>
<mat-card-actions class="float-right">
<button mat-button (click)="VerifySignature()" class="popUpButtons">Verify</button>
<button mat-button (click)="closePopup()" class="popUpButtons">Close</button>
</mat-card-actions>
</div>
<ng-template #help>
<div class="normalText">
<div class="row" style="text-align: center;">
<div class="col-12">
<span class="helpHeading">How can I Validate Digital Signature? </span>
</div>
</div>
<br>
<br>
<h6> Connect Security Device
</h6>
<ul>
<li> Plug in the security device that has the necessary security keys.
</li>
</ul>
<h6> Select Key Files
</h6>
<ul>
<li> Choose the Public key files for both the secretary and the president, usually provided on the security device.
</li>
<li>Locate the Public key document or file that you want to validate.</li>
</ul>
<div class="row" style="text-align: center;">
<div class="col-12" >
<span style="font-family: nucleo;font-size: larger; color: #1e3d3b;">You can access Tender Reports only after validating the digital signatures of President and Secretary.</span>
</div>
</div>
<div style="text-align: right;">
<a style="color: #46AC9E;cursor: pointer;" (click)="closeDialog()">Close</a>
</div>
</div>
</ng-template>
</mat-card>
<div *ngIf="!showPopup">
<div class="buttonCard"> <div class="buttonCard">
<button mat-stroked-button (click)="backButton()" class="backButton"> <button mat-stroked-button (click)="backButton()" class="backButton">
@ -274,3 +383,5 @@
<span *ngIf="!captchaMatching" style="color: red;">Captcha Not Matching</span> <span *ngIf="!captchaMatching" style="color: red;">Captcha Not Matching</span>
</div> </div>
</ng-template> </ng-template>
</div>

@ -398,3 +398,106 @@ input {
.table-responsive { .table-responsive {
overflow-x: scroll; overflow-x: scroll;
} }
// ------------------------digital signature----------------------------////////
.popup-card {
position: fixed;
background-color: #ffffff;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 450px;
height: 330px;
z-index: 1000;
}
.popup-container {
padding: 20px; /* Add padding for better spacing */
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
}
.mainCard{
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
border-radius: 10px;
}
.resetSpan{
font-family: texg;
color: #1e3d3b;
font-size: xx-large;
float: center;
margin-top: 15px;
// margin-left: 64px;
}
h6{
font-family:nucleo;
}
.helpHeading{
font-family: texg;
color: #1e3d3b;
font-size: x-large;
float: center;
margin-top: 15px;
}
.centered-form {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
@media screen and (max-width: 600px) {
.popup-card {
width: 450px; /* Adjust card width for smaller screens */
}
}
.mat-card-actions {
display: flex;
justify-content: flex-end;
padding: 16px; /* Add padding for spacing */
}
.popUpButtons{
padding: 5px;
color: #353535;
font-weight: 900;
font-size: medium;
// background-color: #ececec;
font-family:nucleo;
}
.popUpButtons:hover{
background-color: #ebeaea ;
color:#46AC9E;
box-shadow: 0 2px rgb(129, 129, 129)a(0, 0, 0, 0.2);
// transform: translateY(5px);
}
.custom-spinner-content {
font-size: 24px;
color:#46AC9E;
margin: 0;
padding: 0;
}
.normalText{
font-family: nucleo;
}

@ -8,6 +8,7 @@ import { ErrorTranslateService } from 'src/app/_providers/_services/error-transl
import { MasterService } from 'src/app/_providers/_services/master.service'; import { MasterService } from 'src/app/_providers/_services/master.service';
import { UiService } from 'src/app/_providers/_services/ui.service'; import { UiService } from 'src/app/_providers/_services/ui.service';
import { environment } from 'src/environments/environment.prod'; import { environment } from 'src/environments/environment.prod';
import Swal from 'sweetalert2';
import * as XLSX from 'xlsx'; import * as XLSX from 'xlsx';
@Component({ @Component({
selector: 'app-bid-final-report', selector: 'app-bid-final-report',
@ -48,6 +49,17 @@ export class BidFinalReportComponent implements OnInit {
captchaMatching: boolean = true; captchaMatching: boolean = true;
fileSelected: boolean;
fileSelected2:boolean;
showPopup:boolean = false;
Secretary:any;
President:any;
selectedSecretaryFile: any;
selectedPresidentFile: any;
SecretarySigned: boolean;
PresidentSigned: boolean;
userDocId: any; userDocId: any;
isIconRotating: boolean; isIconRotating: boolean;
@ -67,8 +79,204 @@ export class BidFinalReportComponent implements OnInit {
this.getHeaderData(this.tenderId); this.getHeaderData(this.tenderId);
this.getTableData(this.tenderId); this.getTableData(this.tenderId);
this.printType = 'portrait'; this.printType = 'portrait';
this.showPopup = true;
this.fileSelected = false
this.fileSelected2 = false
}
// -------------------------digital signature-------------------------------------//
closePopup() {
this.navigateTo('/dashboard')
this.showPopup = false;
this.Secretary =''
this.President = ''
}
async UploadsecretaryFiles(event,SecretaryFile){
const allowedExtensions = ['cer'];
this.selectedSecretaryFile = event.target.files[0];
if (this.selectedSecretaryFile) {
const fileExtension = this.selectedSecretaryFile.name.split('.').pop();
if (!allowedExtensions.includes(fileExtension)) {
this._ui.toastMessage(this._errorService.translate('invalidFileFormat'), 3000);
return;
}
this.Secretary = this.selectedSecretaryFile.name;
const formData = new FormData();
formData.append('adminUser', '2');
formData.append('certificate', this.selectedSecretaryFile);
// console.log("s",formData);
await this._masterService.saveMasterData(apiUrl.digitalSignature,formData).then((res) =>{
// console.log(res);
if(res.message = "Authentication Successfully Completed"){
this._ui.toastMessage(this._errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.SecretarySigned = true
}else{
this.SecretarySigned = false
}
},(err) => {
if(err.status === 201){
this._ui.toastMessage(this._errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.SecretarySigned = true
}
else if(err.status === 500) {
this._ui.toastMessage(this._errorService.translate('invalidFileFormat'), 3000);
}
else if(err.status === 400){
this._ui.toastMessage(this._errorService.translate('KeyNotMatchingPleaseTryAgain'), 3000);
this.SecretarySigned = false
this.Secretary =''
}
else if(err.status === 401){
this._ui.toastMessage(this._errorService.translate('Digital Signature Expired'), 3000);
this.SecretarySigned = false
this.Secretary =''
}
})
}
}
deleteSecretaryInput(){
}
async UploadPresidentFiles(event,President){
const allowedExtensions = ['cer'];
this.selectedPresidentFile = event.target.files[0];
if (this.selectedPresidentFile) {
const fileExtension = this.selectedPresidentFile.name.split('.').pop();
if (!allowedExtensions.includes(fileExtension)) {
this._ui.toastMessage(this._errorService.translate('invalidFileFormat'), 3000);
return;
}
else{
this.President = this.selectedPresidentFile.name;
const formData = new FormData();
formData.append('adminUser', '1');
formData.append('certificate', this.selectedPresidentFile);
await this._masterService.saveMasterData(apiUrl.digitalSignature,formData).then((res) =>{
console.log(res);
if(res.message = "Authentication Successfully Completed"){
this._ui.toastMessage(this._errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.PresidentSigned = true
}else{
this.PresidentSigned = false
}
},(err) => {
if(err.status === 201){
this._ui.toastMessage(this._errorService.translate('AuthenticationSuccessfullyCompleted'), 3000);
this.PresidentSigned = true
}
else if (err.status === 500) {
this._ui.toastMessage(this._errorService.translate('invalidFileFormat'), 3000);
}
else if(err.status === 400){
this._ui.toastMessage(this._errorService.translate('KeyNotMatchingPleaseTryAgain'), 3000);
this.PresidentSigned = false
this.President = ''
}
else if(err.status === 401){
this._ui.toastMessage(this._errorService.translate('Digital Signature Expired'), 3000);
this.PresidentSigned = false
this.President = ''
}
})
}
}
} }
VerifySignature(){
this.showPopup = true;
if(this.Secretary == null || this.Secretary == '' || this.Secretary == undefined){
this._ui.toastMessage(this._errorService.translate('secretarySignatureCantBeBlank'), 3000);
return false
}else if(this.President == null || this.President == '' || this.President == undefined){
this._ui.toastMessage(this._errorService.translate('PresidentSignatureCantBeBlank'), 3000);
return false
console.log();
}else if(!this.SecretarySigned && !this.PresidentSigned){
Swal.fire({
icon: 'error',
title: 'Oops...',
text: 'Something went wrong!',
})
return false
}
else if(this.SecretarySigned && this.PresidentSigned){
Swal.fire({
icon: 'success',
title: 'Verified Successfully',
showConfirmButton: false,
timer: 1500
})
this.showPopup = false;
}
}
openHelpDialog(templateRef) {
this.dialogRef = this.dialog.open(templateRef, {
width: '700px',
disableClose: false
});
}
closeDialog() {
this.dialogRef.close()
}
navigateTo(destination) { navigateTo(destination) {
this._router.navigate([destination]) this._router.navigate([destination])
} }
@ -87,7 +295,7 @@ export class BidFinalReportComponent implements OnInit {
getTableData(id) { getTableData(id) {
this._masterService.getMasterDatabyId(apiUrl.bidReport, id).then(res => { this._masterService.getMasterDatabyId(apiUrl.bidReport, id).then(res => {
this.tableData = res.filter(element => element.status == 'S' && element.finalBidAmt); this.tableData = res.report.filter(element => element.status == 'S' && element.finalBidAmt);
this.dataSource = new MatTableDataSource(this.tableData); this.dataSource = new MatTableDataSource(this.tableData);
this.dataSource.sort = this.sort; this.dataSource.sort = this.sort;
}) })

@ -49,7 +49,11 @@ export const apiUrl = {
paymentInfo:"payment-master/paymentInfo", paymentInfo:"payment-master/paymentInfo",
paymentMaster:"payment-master", paymentMaster:"payment-master",
paymentUserCheck:"payment-master/userBidPaymentCheck", paymentUserCheck:"payment-master/userBidPaymentCheck",
paymentupdatePaymentStatus:"payment-master/updatePaymentStatus" paymentupdatePaymentStatus:"payment-master/updatePaymentStatus",
common:"common",
confirmPayment:"auth/otp/CP",
digitalSignature: "report-authentication/upload-certificate",
TenderStatus: "tender/status"
}; };
export const apiFilterProperties = { export const apiFilterProperties = {

@ -200,7 +200,7 @@ section {
# Header # Header
--------------------------------------------------------------*/ --------------------------------------------------------------*/
#header { #header {
height: 80px; height: 100px;
transition: all 0.5s; transition: all 0.5s;
z-index: 997; z-index: 997;
transition: all 0.5s; transition: all 0.5s;
@ -269,10 +269,10 @@ section {
width: 100%; width: 100%;
padding-top: 0; padding-top: 0;
padding-bottom: 0; padding-bottom: 0;
background-color: #ffffff; background-color: #eef5f1;
/* background-color: #e7e7e7; */ /* background-color: #e7e7e7; */
position: fixed; position: fixed;
top: 50px; /* Adjust the value based on the height of your header */ top: 68px; /* Adjust the value based on the height of your header */
z-index: 1; z-index: 1;
transition: top 0.3s; /* Add transition for smooth animation */ transition: top 0.3s; /* Add transition for smooth animation */
} }
@ -543,7 +543,7 @@ section {
#hero:before { #hero:before {
content: ""; content: "";
background: rgba(29, 29, 29, 0.85); background: rgba(39, 39, 39, 0.85);
position: absolute; position: absolute;
bottom: 0; bottom: 0;
top: 0; top: 0;

@ -144,6 +144,14 @@
"pleaseAgreeToTheTermsandCondition":"Please Agree To The Terms and Condition", "pleaseAgreeToTheTermsandCondition":"Please Agree To The Terms and Condition",
"pleasePayTheAmountForDoc":"Please Pay The Amount For Downloading Documents", "pleasePayTheAmountForDoc":"Please Pay The Amount For Downloading Documents",
"emailSentSuccessfully":"Email Sent Successfully", "emailSentSuccessfully":"Email Sent Successfully",
"pleaseEnterTransId":"Please Enter Transaction Id" "pleaseEnterTransId":"Please Enter Transaction Id",
"notificationTextCannotBeBlank":"Notification Text Cannot Be Blank",
"notificationTextSaved":"Notification Text Saved",
"secretarySignatureCantBeBlank":"Secretary Signature Can't Be Blank",
"PresidentSignatureCantBeBlank":"President Signature Can't Be Blank",
"invalidFileFormat":"Invalid File Format",
"AuthenticationSuccessfullyCompleted":"Authentication Successfully Completed",
"verificationFailed":"Verification Failed",
"KeyNotMatchingPleaseTryAgain":"Key Not Matching. Please Try Again"
} }

@ -342,6 +342,10 @@
"addTender":"Add Tender", "addTender":"Add Tender",
"forgotPass":"Forgot Password?", "forgotPass":"Forgot Password?",
"forgotYourPass":"Forgot Your Password?", "forgotYourPass":"Forgot Your Password?",
"digitalSignature": "Digital Signature",
"SecretarySignature":"Secretary Signature",
"PresidentSignature":"President Signature",
"QRpayment":"QR Payment",
"assetImagePath":"Asset File Path", "assetImagePath":"Asset File Path",
"title":"Title", "title":"Title",
"publishedDate":"Published Date", "publishedDate":"Published Date",

Loading…
Cancel
Save