modifications
commit
52f1fd5473
@ -0,0 +1,12 @@
|
||||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
|
||||
# For additional information regarding the format and rule options, please see:
|
||||
# https://github.com/browserslist/browserslist#queries
|
||||
|
||||
# You can see what browsers were selected by your queries by running:
|
||||
# npx browserslist
|
||||
|
||||
> 0.5%
|
||||
last 2 versions
|
||||
Firefox ESR
|
||||
not dead
|
||||
not IE 9-11 # For IE 9-11 support, remove 'not'.
|
||||
@ -0,0 +1,16 @@
|
||||
# Editor configuration, see https://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.ts]
|
||||
quote_type = single
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
||||
@ -0,0 +1,120 @@
|
||||
# ---> Node
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.test
|
||||
.env.production
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Flatlogic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@ -0,0 +1,114 @@
|
||||
{
|
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||
"cli": {
|
||||
"analytics": false
|
||||
},
|
||||
"version": 1,
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"angular-material-admin": {
|
||||
"projectType": "application",
|
||||
"schematics": {},
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"prefix": "app",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"options": {
|
||||
"outputPath": "dist",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"aot": true,
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets"
|
||||
],
|
||||
"styles": [
|
||||
"./node_modules/font-awesome/scss/font-awesome.scss",
|
||||
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
|
||||
"./node_modules/ngx-toastr/toastr.css",
|
||||
"src/custom-theme.scss",
|
||||
"./node_modules/sweetalert2/dist/sweetalert2.css"
|
||||
],
|
||||
"scripts": [ "./node_modules/sweetalert2/dist/sweetalert2.js"]
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"fileReplacements": [
|
||||
{
|
||||
"replace": "src/environments/environment.ts",
|
||||
"with": "src/environments/environment.prod.ts"
|
||||
}
|
||||
],
|
||||
"optimization": true,
|
||||
"outputHashing": "all",
|
||||
"sourceMap": false,
|
||||
"namedChunks": false,
|
||||
"extractLicenses": true,
|
||||
"vendorChunk": false,
|
||||
"buildOptimizer": true,
|
||||
"budgets": [
|
||||
{
|
||||
"type": "initial",
|
||||
"maximumWarning": "2mb",
|
||||
"maximumError": "5mb"
|
||||
},
|
||||
{
|
||||
"type": "anyComponentStyle",
|
||||
"maximumWarning": "6kb",
|
||||
"maximumError": "10kb"
|
||||
}
|
||||
]
|
||||
},
|
||||
"hmr": {
|
||||
"fileReplacements": [
|
||||
{
|
||||
"replace": "src/environments/environment.ts",
|
||||
"with": "src/environments/environment.hmr.ts"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"options": {
|
||||
"browserTarget": "angular-material-admin:build"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "angular-material-admin:build:production"
|
||||
},
|
||||
"hmr": {
|
||||
"hmr": true,
|
||||
"browserTarget": "angular-material-admin:build:hmr"
|
||||
}
|
||||
}
|
||||
},
|
||||
"extract-i18n": {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": {
|
||||
"browserTarget": "angular-material-admin:build"
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"tsconfig.app.json",
|
||||
"tsconfig.spec.json",
|
||||
"e2e/tsconfig.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"defaultProject": "angular-material-admin"
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
# Changelog
|
||||
|
||||
## [1.0.6] - 07/09/2021
|
||||
### Updated
|
||||
- Added MIT License
|
||||
|
||||
## [1.0.5] - 05/10/2021
|
||||
### Fixed
|
||||
- Fixed ngx-echarts error
|
||||
|
||||
## [1.0.4] - 05/10/2021
|
||||
### Updated
|
||||
|
||||
- Updated the Angular builder;
|
||||
- Updated the Angular CLI;
|
||||
- Update Angular Material;
|
||||
- Added new package "resize-observer-polyfill" which is dependency of "ngx-echarts"
|
||||
|
||||
###Updated packages
|
||||
@angular/animations: 9.1.12 -> 11.2.13
|
||||
@angular/cdk: 9.2.4 -> 11.2.11
|
||||
@angular/common: 9.1.12 -> 11.2.13
|
||||
@angular/compiler: 9.1.12 -> 11.2.13
|
||||
@angular/core: 9.1.12 -> 11.2.13
|
||||
@angular/forms: 9.1.12 -> 11.2.13
|
||||
@angular/material: 9.2.4 -> 11.2.12
|
||||
@angular/platform-browser: 9.1.12 -> 11.2.13
|
||||
@angular/platform-browser-dynamic: 9.1.12 -> 11.2.13
|
||||
@angular/router: 9.1.12 -> 11.2.13
|
||||
@angular-devkit/build-angular: 0.901.12 -> 0.1102.12
|
||||
@angular/cli: 9.1.12 -> 11.2.12
|
||||
@angular/compiler-cli: 9.1.12 -> 11.2.13
|
||||
@angular/language-service: 9.1.12 -> 11.2.13
|
||||
@types/echarts: 4.6.7 -> 4.9.7
|
||||
@types/jasmine: 3.5.14 -> 3.6.0
|
||||
tslib: 1.10.0 -> 2.0.0
|
||||
codelyzer: 5.1.2 -> 6.0.0
|
||||
typescript: 3.8.3 -> 4.1.5
|
||||
apexcharts: 3.19.3 -> 3.26.2
|
||||
echarts: 4.7.0 -> 5.1.1
|
||||
ng-apexcharts: 1.2.3 -> 1.5.9
|
||||
ngx-echarts: 4.2.2 -> 6.0.1
|
||||
ngx-toastr: 12.0.1 -> 13.2.1
|
||||
ngx-trend: 5.0.1 -> 6.1.1
|
||||
rxjs: 6.5.5 -> 7.0.0
|
||||
|
||||
###Added packages
|
||||
resize-observer-polyfill: 1.5.1
|
||||
|
||||
## [1.0.3]
|
||||
|
||||
### Fixed
|
||||
- Notifications: fix titles
|
||||
- Tables add more padding
|
||||
- Add unlock-button
|
||||
- Clear code
|
||||
|
||||
## [1.0.2]
|
||||
|
||||
### Update
|
||||
- Minor package updates
|
||||
|
||||
## [1.0.1]
|
||||
|
||||
### Added
|
||||
- The added configuration for router module.
|
||||
|
||||
## [1.0.0]
|
||||
|
||||
### Added
|
||||
- Added Angular Material Admin v1.0.0
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,69 @@
|
||||
{
|
||||
"name": "angular-material-admin",
|
||||
"version": "1.0.6",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve",
|
||||
"build": "ng build --prod",
|
||||
"lint": "ng lint",
|
||||
"hmr": "ng serve --configuration hmr"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@agm/core": "^1.1.0",
|
||||
"@angular/animations": "^11.2.13",
|
||||
"@angular/cdk": "^11.2.12",
|
||||
"@angular/common": "~11.2.13",
|
||||
"@angular/compiler": "~11.2.13",
|
||||
"@angular/core": "~11.2.13",
|
||||
"@angular/forms": "~11.2.13",
|
||||
"@angular/material": "^11.2.12",
|
||||
"@angular/material-moment-adapter": "^12.0.0",
|
||||
"@angular/platform-browser": "~11.2.13",
|
||||
"@angular/platform-browser-dynamic": "~11.2.13",
|
||||
"@angular/router": "~11.2.13",
|
||||
"@ng-idle/core": "^11.1.0",
|
||||
"@ng-idle/keepalive": "^11.0.3",
|
||||
"@ngx-translate/core": "^13.0.0",
|
||||
"@ngx-translate/http-loader": "^6.0.0",
|
||||
"angular-dual-listbox": "^6.0.0",
|
||||
"apexcharts": "3.26.2",
|
||||
"bootstrap": "^5.1.3",
|
||||
"bootstrap-icons": "^1.10.5",
|
||||
"crypto-js": "^4.1.1",
|
||||
"echarts": "5.1.1",
|
||||
"file-saver": "^2.0.5",
|
||||
"font-awesome": "^4.7.0",
|
||||
"moment": "^2.29.1",
|
||||
"ng-apexcharts": "1.5.9",
|
||||
"ng-otp-input": "^1.8.1",
|
||||
"ngx-bootstrap": "^7.0.0",
|
||||
"ngx-echarts": "6.0.1",
|
||||
"ngx-mat-timepicker": "^15.1.3",
|
||||
"ngx-toastr": "13.2.1",
|
||||
"ngx-trend": "6.1.1",
|
||||
"pdfmake": "^0.2.5",
|
||||
"rxjs": "7.0.0",
|
||||
"sweetalert2": "^11.7.16",
|
||||
"to-words": "^3.2.0",
|
||||
"tslib": "^2.0.0",
|
||||
"xlsx": "^0.16.9",
|
||||
"zone.js": "~0.10.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "~0.1102.12",
|
||||
"@angular/cli": "~11.2.12",
|
||||
"@angular/compiler-cli": "~11.2.13",
|
||||
"@angular/language-service": "~11.2.13",
|
||||
"@angularclass/hmr": "^2.1.3",
|
||||
"@types/echarts": "^4.9.7",
|
||||
"@types/jasmine": "~3.6.0",
|
||||
"@types/jasminewd2": "~2.0.8",
|
||||
"@types/node": "^12.12.64",
|
||||
"codelyzer": "^6.0.0",
|
||||
"resize-observer-polyfill": "^1.5.1",
|
||||
"ts-node": "~8.3.0",
|
||||
"tslint": "~6.1.0",
|
||||
"typescript": "4.1.5"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, CanActivateChild } from '@angular/router';
|
||||
import { Observable } from 'rxjs';
|
||||
import { routePath } from 'src/app/_providers/_resources/route-path.properties';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 04-01-2020
|
||||
Created For : For handling the route path of the application.
|
||||
For provding security i.e it blocks unautherized acess of rote paths.
|
||||
*/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class AppGuard implements CanActivate {
|
||||
|
||||
constructor(
|
||||
private router: Router
|
||||
){}
|
||||
|
||||
canActivate(
|
||||
next: ActivatedRouteSnapshot,
|
||||
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
|
||||
|
||||
const currentUser = localStorage.getItem("authtoken");
|
||||
console.log("===currentUser====",currentUser);
|
||||
if (!currentUser) {
|
||||
return true;
|
||||
}
|
||||
this.router.navigate([routePath.dashboard]);
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,65 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, CanActivateChild } from '@angular/router';
|
||||
import { Observable } from 'rxjs';
|
||||
import { routePath } from 'src/app/_providers/_resources/route-path.properties';
|
||||
import { CryptoService } from '../_security/crypto.service';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 04-01-2020
|
||||
Created For : For handling the route path of the application.
|
||||
For provding security i.e it blocks unautherized acess of rote paths.
|
||||
*/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class AuthStudentGuard implements CanActivate, CanActivateChild {
|
||||
|
||||
constructor(
|
||||
private router: Router,
|
||||
// private lan: LangaugeTranslateService,
|
||||
private crypto: CryptoService
|
||||
) { }
|
||||
|
||||
async canActivate(
|
||||
next: ActivatedRouteSnapshot,
|
||||
state: RouterStateSnapshot): Promise<boolean>
|
||||
// | Observable<boolean> | boolean
|
||||
{
|
||||
const currentUser = localStorage.getItem("authtoken");
|
||||
const secuLevel = localStorage.getItem("seculevel");
|
||||
console.log("==sec level===", secuLevel);
|
||||
|
||||
if (currentUser && secuLevel.toString() == "2") {
|
||||
// await this.lan.init();
|
||||
return true;
|
||||
}
|
||||
|
||||
let authKey = localStorage.getItem("authKey");
|
||||
//Ayth key null check Added
|
||||
if (authKey)
|
||||
authKey = this.crypto.decrypt(authKey);
|
||||
let url = '';
|
||||
if (authKey)
|
||||
url = `${authKey}${routePath.login}`;
|
||||
else
|
||||
url = routePath.login;
|
||||
console.log("=====url===", url);
|
||||
await this.router.navigate([url], { queryParams: { returnUrl: state.url } });
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
canActivateChild(
|
||||
next: ActivatedRouteSnapshot,
|
||||
state: RouterStateSnapshot,
|
||||
): Observable<boolean> | Promise<boolean> | boolean {
|
||||
// if (state.url != "/404" && (this.service.menus && this.service.menus.length > 0 && !this.service.menus.some(menu => menu.routerLink === state.url.split(";")[0])))
|
||||
// this.router.navigate([routePath.dashboard]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, CanActivateChild } from '@angular/router';
|
||||
import { Observable } from 'rxjs';
|
||||
import { routePath } from 'src/app/_providers/_resources/route-path.properties';
|
||||
import { CryptoService } from '../_security/crypto.service';
|
||||
|
||||
/*
|
||||
Created By : Sajan
|
||||
Created On : 11-07-2023
|
||||
Created For : For handling the route path of the application.
|
||||
For provding security i.e it blocks unautherized acess of rote paths.
|
||||
*/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class AuthGuard implements CanActivate, CanActivateChild {
|
||||
|
||||
constructor(
|
||||
private router: Router,
|
||||
// private lan: LangaugeTranslateService,
|
||||
private crypto: CryptoService
|
||||
) { }
|
||||
|
||||
async canActivate(
|
||||
next: ActivatedRouteSnapshot,
|
||||
state: RouterStateSnapshot): Promise<boolean>
|
||||
// | Observable<boolean> | boolean
|
||||
{
|
||||
const currentUser = localStorage.getItem("authtoken");
|
||||
if (currentUser ) {
|
||||
// await this.lan.init();
|
||||
return true;
|
||||
}
|
||||
|
||||
let authKey = localStorage.getItem("authKey");
|
||||
//Ayth key null check Added
|
||||
if (authKey)
|
||||
authKey = this.crypto.decrypt(authKey);
|
||||
let url = '';
|
||||
if (authKey) {
|
||||
url = `${authKey}${routePath.home}`;
|
||||
}
|
||||
url = routePath.home;
|
||||
|
||||
await this.router.navigate([url], { queryParams: { returnUrl: state.url } });
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
canActivateChild(
|
||||
next: ActivatedRouteSnapshot,
|
||||
state: RouterStateSnapshot,
|
||||
): Observable<boolean> | Promise<boolean> | boolean {
|
||||
// if (state.url != "/404" && (this.service.menus && this.service.menus.length > 0 && !this.service.menus.some(menu => menu.routerLink === state.url.split(";")[0])))
|
||||
// this.router.navigate([routePath.dashboard]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
|
||||
import { Observable } from 'rxjs';
|
||||
import { DirtyComponent } from './model/dirty-component';
|
||||
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class DirtyCheckGuard implements CanDeactivate<DirtyComponent> {
|
||||
|
||||
canDeactivate(
|
||||
component: DirtyComponent,
|
||||
next: ActivatedRouteSnapshot,
|
||||
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
|
||||
if (component.canDeactivate()) {
|
||||
return confirm('There are changes you have made to the page. If you quit, you will lose your changes.');
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
import {Observable} from 'rxjs';
|
||||
|
||||
export declare interface DirtyComponent {
|
||||
canDeactivate: () => boolean | Observable<boolean>;
|
||||
}
|
||||
@ -0,0 +1,102 @@
|
||||
import { Injectable } from "@angular/core";
|
||||
import { HttpInterceptor, HttpRequest, HttpHandler, HttpResponse } from "@angular/common/http";
|
||||
import { catchError, tap } from "rxjs/operators";
|
||||
import { throwError } from "rxjs";
|
||||
import { Router } from '@angular/router';
|
||||
import { CryptoService } from '../_security/crypto.service';
|
||||
import { routePath } from "src/app/_providers/_resources/route-path.properties";
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 03-01-2020
|
||||
Created For : For handling the http api request before it calling.
|
||||
*/
|
||||
|
||||
@Injectable()
|
||||
export class AuthHeaderInterceptor implements HttpInterceptor {
|
||||
|
||||
constructor(
|
||||
private crypto: CryptoService,
|
||||
private router: Router
|
||||
) { }
|
||||
|
||||
intercept(request: HttpRequest<any>, next: HttpHandler) {
|
||||
|
||||
if (request.url.includes('auth'))
|
||||
return next.handle(this.addAuthKey(request))
|
||||
|
||||
if (request.url.startsWith('assets/') && request.url.endsWith('.json'))
|
||||
return next.handle(request)
|
||||
|
||||
return next.handle(this.addAuthenticationToken(request))
|
||||
.pipe(catchError(error => {
|
||||
if (error.status === 401) {
|
||||
return next.handle(this.addAuthenticationToken(request, true))
|
||||
.pipe(
|
||||
tap(event => {
|
||||
if (event instanceof HttpResponse) {
|
||||
localStorage.setItem("authtoken", event.headers.get('Authorization'));
|
||||
}
|
||||
}),
|
||||
catchError(err => {
|
||||
if (error.status === 401) {
|
||||
this.presentAlert();
|
||||
}
|
||||
return throwError(error);
|
||||
}));
|
||||
}
|
||||
return throwError(error);
|
||||
}));
|
||||
}
|
||||
|
||||
private addAuthKey(request: HttpRequest<any>): HttpRequest<any>{
|
||||
// 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.
|
||||
let authKey = localStorage.getItem("authKey");
|
||||
// authKey = this.crypto.decrypt(authKey);
|
||||
if (!authKey) {
|
||||
return request;
|
||||
}
|
||||
return request.clone({
|
||||
setHeaders: {
|
||||
'authkey': `${authKey}`,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
private addAuthenticationToken(request: HttpRequest<any>, hasRefreshToken?: boolean): HttpRequest<any> {
|
||||
// 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.
|
||||
const authtoken = localStorage.getItem('authtoken');
|
||||
const emailId = localStorage.getItem('emailId') ? localStorage.getItem('emailId') : "";
|
||||
const module = localStorage.getItem('module') ? localStorage.getItem('module') : "";
|
||||
const refreshtoken = localStorage.getItem('refreshtoken');
|
||||
const authKey = localStorage.getItem('authKey');
|
||||
|
||||
if (!authtoken) {
|
||||
return request;
|
||||
}
|
||||
// If you are calling an outside domain then do not add the token.
|
||||
// if (!request.url.match(/www.mydomain.com\//)) {
|
||||
// return request;
|
||||
// }
|
||||
return request.clone({
|
||||
setHeaders: {
|
||||
Authorization: `Bearer ${this.crypto.get("accessToken@#123", (!authtoken ? "" : authtoken))}`,
|
||||
'refreshtoken': !hasRefreshToken ? '' : `${this.crypto.get("accessToken@#123", (!refreshtoken ? "" : refreshtoken))}`,
|
||||
'emailid': `${emailId}`,
|
||||
'module': `${module}`,
|
||||
'authkey': `${authKey}`,
|
||||
},
|
||||
});
|
||||
}
|
||||
async presentAlert() {
|
||||
localStorage.setItem("authtoken", "");
|
||||
localStorage.setItem("refreshtoken", "");
|
||||
localStorage.removeItem("authtoken");
|
||||
localStorage.removeItem("refreshtoken");
|
||||
localStorage.removeItem("media");
|
||||
this.router.navigate([routePath.login]);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
import { HTTP_INTERCEPTORS } from '@angular/common/http'
|
||||
import { AuthHeaderInterceptor } from './auth-header.interceptor';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 03-01-2020
|
||||
Created For : For handling the http api interceptor.
|
||||
*/
|
||||
|
||||
export const HttpInterceptProviders = [
|
||||
{provide: HTTP_INTERCEPTORS, useClass: AuthHeaderInterceptor, multi: true}
|
||||
];
|
||||
@ -0,0 +1,46 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import * as CryptoJS from 'crypto-js';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 13-01-2020
|
||||
Created For : For decrypting the crypto encrpited data.
|
||||
*/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class CryptoService {
|
||||
|
||||
constructor() { }
|
||||
|
||||
//The get method is use for decrypt the value.
|
||||
get(keys, value) {
|
||||
var key = CryptoJS.enc.Utf8.parse(keys);
|
||||
var iv = CryptoJS.enc.Utf8.parse(keys);
|
||||
var decrypted = CryptoJS.AES.decrypt(value, key, {
|
||||
keySize: 128 / 8,
|
||||
iv: iv,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
// console.log("====value=====", decrypted.toString(CryptoJS.enc.Utf8));
|
||||
return decrypted.toString(CryptoJS.enc.Utf8);
|
||||
}
|
||||
|
||||
encrypt(value) {
|
||||
let b64 = CryptoJS.AES.encrypt(value.toString(), "etarucca").toString();
|
||||
let e64 = CryptoJS.enc.Base64.parse(b64);
|
||||
let encryptedCode = e64.toString(CryptoJS.enc.Hex);
|
||||
return encryptedCode;
|
||||
}
|
||||
|
||||
decrypt(value) {
|
||||
var reb64 = CryptoJS.enc.Hex.parse(value);
|
||||
var bytes = reb64.toString(CryptoJS.enc.Base64);
|
||||
var decrypt = CryptoJS.AES.decrypt(bytes, "etarucca");
|
||||
var dycryptedCode = decrypt.toString(CryptoJS.enc.Utf8);
|
||||
return dycryptedCode;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CoreComponent } from './core.component';
|
||||
|
||||
describe('CoreComponent', () => {
|
||||
let component: CoreComponent;
|
||||
let fixture: ComponentFixture<CoreComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ CoreComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(CoreComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,20 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'lib-core',
|
||||
template: `
|
||||
<p>
|
||||
core works!
|
||||
</p>
|
||||
`,
|
||||
styles: [
|
||||
]
|
||||
})
|
||||
export class CoreComponent implements OnInit {
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CoreComponent } from './core.component';
|
||||
|
||||
|
||||
|
||||
@NgModule({
|
||||
declarations: [CoreComponent],
|
||||
imports: [
|
||||
],
|
||||
exports: [CoreComponent]
|
||||
})
|
||||
export class CoreModule { }
|
||||
@ -0,0 +1,16 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
|
||||
import { CoreService } from './core.service';
|
||||
|
||||
describe('CoreService', () => {
|
||||
let service: CoreService;
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({});
|
||||
service = TestBed.inject(CoreService);
|
||||
});
|
||||
|
||||
it('should be created', () => {
|
||||
expect(service).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,9 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class CoreService {
|
||||
|
||||
constructor() { }
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
export class AuthCreadentialsDto {
|
||||
|
||||
username: string;
|
||||
|
||||
password: string;
|
||||
|
||||
module?: string;
|
||||
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 07-01-2020
|
||||
Created For : For creating dto for autehntication
|
||||
*/
|
||||
|
||||
export class AuthenticationDto {
|
||||
username: string = "";
|
||||
password: string = "";
|
||||
confpassword?: string = "";
|
||||
email:string= "";
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
export class FilterJsonDto {
|
||||
search: string | null;
|
||||
sessionId: number | null;
|
||||
courseId: number | null;
|
||||
sectionId: number | null;
|
||||
activeStatusId: string | null;
|
||||
studentId: number | null;
|
||||
admitStatusId: number | null;
|
||||
}
|
||||
@ -0,0 +1,41 @@
|
||||
export class IgenMenuDto {
|
||||
|
||||
menuId: string;
|
||||
|
||||
description: string;
|
||||
|
||||
routerLink: string;
|
||||
|
||||
parentMenuId: string;
|
||||
|
||||
menuType: string = "1";
|
||||
|
||||
icon: string;
|
||||
|
||||
isMegaMenu: boolean;
|
||||
|
||||
displaySeq: number;
|
||||
|
||||
interfaceYn: string = "N";
|
||||
|
||||
coCode: string;
|
||||
|
||||
tableName: string;
|
||||
|
||||
openMultipleTab: string = "N";
|
||||
|
||||
tableDesc: string;
|
||||
|
||||
menuEnabled: string = "N";
|
||||
|
||||
languageLabelCode: string;
|
||||
|
||||
rightsGiven: string;
|
||||
|
||||
submenu?: IgenMenuDto[];
|
||||
|
||||
role:string;
|
||||
|
||||
project: string;
|
||||
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
export class IgissueDetailDto {
|
||||
code: number;
|
||||
refCode: number;
|
||||
description: string;
|
||||
descriptionSl: string;
|
||||
seen: string;
|
||||
imagePath: string;
|
||||
developerYn: string;
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
import { IgissueDetailDto } from "./igissue-detail.dto";
|
||||
|
||||
export class IgissueSummaryDto {
|
||||
code: number;
|
||||
summary: string;
|
||||
name: string;
|
||||
issueType: string;
|
||||
source: string;
|
||||
identifiedBy: string;
|
||||
identifiedDate: Date;
|
||||
relatedProject: string;
|
||||
assignedTo: number;
|
||||
status: string;
|
||||
priority: string;
|
||||
targetResolutionDate: Date;
|
||||
progress: string;
|
||||
actualResolutionDate: Date;
|
||||
resolutionSummary: string;
|
||||
identifiedByEmail: string;
|
||||
unreadCount: number;
|
||||
igissueDetailDto?: IgissueDetailDto[];
|
||||
hold?:string
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
export declare class MenuFormatDto {
|
||||
label: string;
|
||||
icon: string;
|
||||
langaugeLabelCode: string;
|
||||
data: MenuDataDto;
|
||||
items?: MenuFormatDto[];
|
||||
routerLink?: string;
|
||||
menuId?: string;
|
||||
isExpanded?:boolean;
|
||||
isSideMenu?:boolean;
|
||||
}
|
||||
export declare class MenuDataDto {
|
||||
menuId: string;
|
||||
description: string;
|
||||
langaugeLabelCode: string;
|
||||
rightsGiven: string;
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
export class PcdUserDto{
|
||||
|
||||
userName : string | null;
|
||||
|
||||
pass : string | null;
|
||||
|
||||
email: string | null;
|
||||
|
||||
otp?:string | null;
|
||||
|
||||
mobileNumber: string | null;
|
||||
|
||||
confPass? : string | null;
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
export class TenderCoversDto{
|
||||
|
||||
|
||||
tenderId:number;
|
||||
coverType:string;
|
||||
Description:string;
|
||||
fileFormat:string
|
||||
crud: any;
|
||||
}
|
||||
@ -0,0 +1,75 @@
|
||||
<<<<<<< HEAD
|
||||
import { TenderCoversDto } from "./tender-covers.dto";
|
||||
import { TenderDocumentDto } from "./tender-documents.dto";
|
||||
|
||||
|
||||
=======
|
||||
import { TenderDocumentDto } from "./tender-documents.dto";
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
export class TenderDetailDto{
|
||||
id: number ;
|
||||
orgChain: string ;
|
||||
tenderRefNo: string ;
|
||||
tenderId: string ;
|
||||
allowTechEval: string ;
|
||||
paymentMode: number ;
|
||||
allowWithdraw: string ;
|
||||
noOfCovers: number ;
|
||||
itemwiseTechEval: string ;
|
||||
allowTwoStageBid: string ;
|
||||
tenderFee: number ;
|
||||
feePayableTo: string ;
|
||||
feePayableAt: string ;
|
||||
tenderFeeExemption: number ;
|
||||
emdAmt: number ;
|
||||
emdPayableTo: string ;
|
||||
allowEmdBgOrSt: string ;
|
||||
emdPercentage: number ;
|
||||
emdPayableAt: string ;
|
||||
title: string ;
|
||||
workDesc: string ;
|
||||
ndaPreQualification: string ;
|
||||
remarks: string ;
|
||||
tenderValue: number ;
|
||||
contractType: string ;
|
||||
location: string ;
|
||||
preBidMeetAdd: string ;
|
||||
allowNdaTender: string ;
|
||||
productCategory: number ;
|
||||
bidValidity: number ;
|
||||
pincode: number ;
|
||||
preBidDate: Date ;
|
||||
allowPreferencialBidder: string ;
|
||||
subCategory: string ;
|
||||
periodOfWork: number ;
|
||||
preBidMeetPlace: string ;
|
||||
bidOpeningPlace: string ;
|
||||
publishDate: Date ;
|
||||
saleStartDate: Date ;
|
||||
clarificationStartDate: Date ;
|
||||
bidSubStartDate: Date ;
|
||||
bidOpenDate: Date ;
|
||||
saleEndDate: Date ;
|
||||
clarificationEndDate: Date ;
|
||||
bidSubEndDate: Date ;
|
||||
tenderInvName: string ;
|
||||
tenderInvAddess: string ;
|
||||
tenderType: number ;
|
||||
tenderCategory: number ;
|
||||
formOfContract: number ;
|
||||
emdFeeType: string ;
|
||||
activeYn: string ;
|
||||
doc_name: string ;
|
||||
description: string ;
|
||||
doc_type: string ;
|
||||
doc_size: number ;
|
||||
File: any ;
|
||||
tenderDoc: TenderDocumentDto[] =[];
|
||||
crud: any;
|
||||
<<<<<<< HEAD
|
||||
covers : TenderCoversDto[] =[];
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
export class TenderDocumentDto{
|
||||
|
||||
tenderId:string;
|
||||
docName:string;
|
||||
description:string;
|
||||
docType:string;
|
||||
documentSize:number;
|
||||
file: any;
|
||||
<<<<<<< HEAD
|
||||
crud: any;
|
||||
documentCategory: any;
|
||||
docCategory: string;
|
||||
=======
|
||||
|
||||
crud: any;
|
||||
|
||||
documentCategory: any;
|
||||
docCategory: string;
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 08-01-2020
|
||||
Created For : For creating dto for token format
|
||||
*/
|
||||
|
||||
export class TokenDto {
|
||||
|
||||
accessToken: string;
|
||||
|
||||
refreshToken: string;
|
||||
|
||||
emailId: string;
|
||||
|
||||
module?: string;
|
||||
}
|
||||
@ -0,0 +1,200 @@
|
||||
<div class="container-responsive">
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- <mat-progress-bar mode="indeterminate" color="warn"></mat-progress-bar> -->
|
||||
<br><br>
|
||||
|
||||
<div class="container text-center">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card-responsive">
|
||||
<div class="card-body-responsive">
|
||||
<div class="table-responsive">
|
||||
<ng-container >
|
||||
<mat-card class="card">
|
||||
<div class="top-bar">
|
||||
<div class="top-left-float">
|
||||
<span>
|
||||
<mat-icon style="margin-right: 3px; transform: translateY(10px);">search</mat-icon>
|
||||
<mat-form-field>
|
||||
<input matInput placeholder="{{ 'search' | translate }}" style="width: fit-content;"
|
||||
[(ngModel)]="searchTerm" (keyup.enter)="search()"/>
|
||||
</mat-form-field>
|
||||
</span>
|
||||
<button mat-raised-button style="color: #46AC9E;" (click)="search()"> {{ 'go' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="top-right-float">
|
||||
<button mat-raised-button style="color: #46AC9E;" (click)="reset()"> {{ 'reset' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<mat-table [dataSource]="dataSource" style="min-width: 500px;display: table;" matSort matSortDisableClear="true" (matSortChange)="sortData($event)"
|
||||
class="table">
|
||||
|
||||
|
||||
|
||||
<ng-container matColumnDef="slno">
|
||||
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
|
||||
{{ 'slno' | translate }}
|
||||
<!-- <mat-icon>sort</mat-icon> -->
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element;let i = index" style="padding: 5px;" class="table-content">
|
||||
{{i+1}}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="title">
|
||||
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
|
||||
{{ 'title' | translate }}
|
||||
<mat-icon>sort</mat-icon>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
{{element?.title}}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="publishedDate">
|
||||
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
|
||||
{{ 'publishedDate' | translate }}
|
||||
<mat-icon>sort</mat-icon>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
{{element?.publishDate| date:"YYYY-MM-dd"}}
|
||||
</td>
|
||||
<!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
<button mat-raised-button>edit</button>
|
||||
</td> -->
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="bidOpenDate">
|
||||
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
|
||||
{{ 'bidOpenDate' | translate }}
|
||||
<mat-icon>sort</mat-icon>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
{{element?.bidOpenDate| date:"YYYY-MM-dd"}}
|
||||
</td>
|
||||
<!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
<button mat-raised-button>edit</button>
|
||||
</td> -->
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="view">
|
||||
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
|
||||
{{ 'view' | translate }}
|
||||
<!-- <mat-icon>sort</mat-icon> -->
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
<button style="padding: 0;" mat-button color="primary"
|
||||
(click)="goToView(element.id)" [disabled]="false">
|
||||
<mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#46AC9E'}">
|
||||
insert_drive_file
|
||||
</mat-icon>
|
||||
</button>
|
||||
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<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 style="padding: 0;" mat-button color="primary"
|
||||
(click)="goToUpload(element.id)" [disabled]="false">
|
||||
<mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#46AC9E'}">
|
||||
cloud_upload
|
||||
</mat-icon>
|
||||
</button>
|
||||
|
||||
</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 }}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<tr mat-header-row *matHeaderRowDef="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="['nodata']" [ngClass]="{'hide': (!noData || loading)}"></tr>
|
||||
|
||||
</mat-table>
|
||||
|
||||
<mat-paginator #paginator [length]="pageLength" [pageSize]="10" [pageSizeOptions]="[5, 10, 25, 100]"
|
||||
aria-label="Select page">
|
||||
</mat-paginator>
|
||||
</mat-card>
|
||||
</ng-container>
|
||||
<!-- <table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th class="col-sm-1">#</th>
|
||||
<th class="col-sm-6">TENDER NAME</th>
|
||||
<th class="col-sm-1">REFERENCE ID</th>
|
||||
<th class="col-sm-1">CLOSING DATE</th>
|
||||
<th class="col-sm-1">BID OPEN DATE</th>
|
||||
<th class="col-sm-1">VIEW</th>
|
||||
<<<<<<< HEAD
|
||||
|
||||
=======
|
||||
<!-- <th class="col-sm-1">UPLOAD</th> -->
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let tender of tenderData; let i = index">
|
||||
<td class="col-sm-1">{{ i + 1 }}</td>
|
||||
<td class="col-sm-6 table-break-word">{{ tender.title }}</td>
|
||||
<td class="col-sm-1 table-break-word">{{ tender.tenderRefNo }}</td>
|
||||
<td class="col-sm-1 table-break-word">{{ tender.saleEndDate | date: 'dd-MM-yyyy' }}</td>
|
||||
<td class="col-sm-1 table-break-word">{{ tender.bidOpenDate | date: 'dd-MM-yyyy' }}</td>
|
||||
<td class="col-sm-1">
|
||||
<button type="button" class="btn btn-outline-danger btn-sm" (click)="goToView(tender.id)"><i
|
||||
class="bi bi-card-list"></i></button>
|
||||
</td>
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
<!-- <td class="col-sm-1" >
|
||||
<button type="button" class="btn btn-outline-dark btn-sm" (click)="goToUpload()"><i class="bi bi-upload"></i></button>
|
||||
</td> -->
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
</tbody>
|
||||
</table> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><br><br>
|
||||
<div class="footer" >
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;" class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023. </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>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
@ -0,0 +1,230 @@
|
||||
// .header {
|
||||
// margin-left: 4%;
|
||||
// margin-top: 20px;
|
||||
// }
|
||||
|
||||
// .header>h6{
|
||||
// a {
|
||||
// text-decoration: none;
|
||||
// color: #262627;
|
||||
// }
|
||||
|
||||
// a:hover {
|
||||
// text-decoration: underline;
|
||||
// cursor: pointer;
|
||||
// }
|
||||
// }
|
||||
|
||||
// mat-card{
|
||||
// min-width: 180px ;
|
||||
// // max-width: 20vw;
|
||||
// height: 200px;
|
||||
// display: inline-block;
|
||||
// }
|
||||
|
||||
// mat-card:hover{
|
||||
// cursor: pointer;
|
||||
// }
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
.nav-link:hover {
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
th,
|
||||
td {
|
||||
padding: 10px;
|
||||
// border: 1px solid #ccc;
|
||||
word-wrap: break-word;
|
||||
white-space: normal;
|
||||
|
||||
}
|
||||
|
||||
.h2 {
|
||||
font-family: sans-serif;
|
||||
font-size: 26px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
|
||||
.table td {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.table-break-word {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.top-bar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
border: 1px solid #e3e3e3;
|
||||
width: 100%;
|
||||
margin: auto;
|
||||
padding: auto;
|
||||
}
|
||||
|
||||
.header {
|
||||
padding: 20px;
|
||||
width: 100%;
|
||||
min-width: 350px;
|
||||
}
|
||||
|
||||
.header>h6>a {
|
||||
text-decoration: none;
|
||||
color: #262627;
|
||||
}
|
||||
|
||||
.header>h6>a:hover {
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
mat-card {
|
||||
min-width: 350px;
|
||||
}
|
||||
|
||||
.top-left-float {
|
||||
display: flex;
|
||||
min-width: 282px;
|
||||
}
|
||||
|
||||
.top-right-float {
|
||||
display: flex;
|
||||
min-width: 161px;
|
||||
}
|
||||
|
||||
.top-left-float>button,
|
||||
.top-right-float>button {
|
||||
margin: 5px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
mat-table {
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
display: table;
|
||||
overflow-x: scroll;
|
||||
.table-headers {
|
||||
padding: 5px;
|
||||
color: #ffffff;
|
||||
font-weight: 900;
|
||||
font-size: medium;
|
||||
background-color: #46AC9E;
|
||||
}
|
||||
|
||||
.table-headers:hover {
|
||||
background-color: #ececec;
|
||||
color:#46AC9E;
|
||||
}
|
||||
|
||||
.table-content {
|
||||
padding: 5px;
|
||||
overflow-wrap: inherit;
|
||||
}
|
||||
|
||||
.table-column {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
input {
|
||||
border: none;
|
||||
border-bottom: 1px solid silver;
|
||||
}
|
||||
|
||||
:host ::ng-deep .mat-slide-toggle.mat-checked:not(.mat-disabled) {
|
||||
|
||||
.mat-slide-toggle-thumb {
|
||||
background-color: #46AC9E;
|
||||
}
|
||||
|
||||
.mat-slide-toggle-bar {
|
||||
background-color: skyblue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// .dialog-body {
|
||||
// display: flex;
|
||||
// justify-content: center;
|
||||
// align-items: center;
|
||||
|
||||
// div {
|
||||
// width: 90%;
|
||||
// }
|
||||
// }
|
||||
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
width: 97%;
|
||||
justify-content: space-between;
|
||||
|
||||
.btn-group-left {
|
||||
// min-width: 150px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.btn-group-right {
|
||||
// min-width: 95px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
:host ::ng-deep {
|
||||
.mat-form-field-infix {
|
||||
border-bottom: 0px solid white;
|
||||
}
|
||||
|
||||
.mat-table {
|
||||
tr {
|
||||
|
||||
th,
|
||||
td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.img-fluid {
|
||||
margin-right: 5px;
|
||||
max-height: 40px;
|
||||
}
|
||||
|
||||
// .navbar {
|
||||
// background-position: center;
|
||||
// }
|
||||
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.card {
|
||||
min-width: 600px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.mat-row:nth-child(even){
|
||||
background-color: rgb(255, 255, 255);
|
||||
}
|
||||
|
||||
.mat-row:nth-child(odd){
|
||||
background-color: rgb(241, 241, 241);
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { AdminHomeComponent } from './admin-home.component';
|
||||
|
||||
describe('AdminHomeComponent', () => {
|
||||
let component: AdminHomeComponent;
|
||||
let fixture: ComponentFixture<AdminHomeComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ AdminHomeComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AdminHomeComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,193 @@
|
||||
import { Component, OnInit,ViewChild } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
|
||||
import { AuthService } from 'src/app/_providers/_services/auth.service';
|
||||
import { MasterService } from 'src/app/_providers/_services/master.service';
|
||||
<<<<<<< HEAD
|
||||
import { MatPaginator } from '@angular/material/paginator';
|
||||
import { MatSort, Sort } from '@angular/material/sort';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto';
|
||||
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
=======
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
@Component({
|
||||
selector: 'app-admin-home',
|
||||
templateUrl: './admin-home.component.html',
|
||||
styleUrls: ['./admin-home.component.scss']
|
||||
})
|
||||
export class AdminHomeComponent implements OnInit {
|
||||
|
||||
tenderData: any;
|
||||
|
||||
<<<<<<< HEAD
|
||||
dataSource: MatTableDataSource<TenderDetailDto>;
|
||||
|
||||
displayedColumns = ['slno','title','publishedDate','bidOpenDate','view'];
|
||||
|
||||
|
||||
dataCopy: any;
|
||||
|
||||
pageLength: any;
|
||||
|
||||
searchTerm:any;
|
||||
|
||||
@ViewChild('paginator') paginator: MatPaginator;
|
||||
|
||||
@ViewChild(MatSort, { static: false }) sort: MatSort;
|
||||
|
||||
loading: boolean = true;
|
||||
|
||||
noData: boolean;
|
||||
|
||||
constructor(
|
||||
private authenticationService: AuthService,
|
||||
private router: Router,
|
||||
private _masterService: MasterService,
|
||||
private errorService:ErrorTranslateService,
|
||||
private _ui: UiService,
|
||||
) { }
|
||||
|
||||
ngOnInit(): void {
|
||||
this.getData()
|
||||
}
|
||||
|
||||
getData(){
|
||||
|
||||
this._masterService.getMasterData(apiUrl.getTender).then((res) =>{
|
||||
console.log("tenderData=1=",res);
|
||||
this.tenderData = res;
|
||||
this.dataCopy = res;
|
||||
this.pageLength = this.tenderData.length;
|
||||
this.dataSource = new MatTableDataSource(this.tenderData);
|
||||
this.dataSource.sort = this.sort;
|
||||
this.dataSource.paginator = this.paginator;
|
||||
this.noData = (this.tenderData && this.tenderData.length == 0) ? true : false;
|
||||
this.loading = false;
|
||||
},err=>{
|
||||
console.error(err)
|
||||
})
|
||||
|
||||
=======
|
||||
|
||||
displayedColumns: string[] = ['no', 'name','download'];
|
||||
|
||||
tenderData: any;
|
||||
|
||||
constructor(private authenticationService: AuthService,
|
||||
private router: Router,
|
||||
private _masterService: MasterService) { }
|
||||
|
||||
ngOnInit(): void {
|
||||
this._masterService.getMasterData(apiUrl.getTender).then((res) =>{
|
||||
console.log("tenderData",res);
|
||||
this.tenderData = res
|
||||
|
||||
|
||||
})
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
public signOut(): void {
|
||||
|
||||
this.authenticationService.logOut();
|
||||
|
||||
}
|
||||
|
||||
signIn(){
|
||||
this.router.navigate(['/login']);
|
||||
}
|
||||
|
||||
goToHome(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
goToView(tenderId:number) {
|
||||
this.router.navigate(['/auth/view',tenderId]);
|
||||
<<<<<<< HEAD
|
||||
}
|
||||
|
||||
goToUpload(tenderId){
|
||||
this.router.navigate(['/tender-upload',tenderId]);
|
||||
}
|
||||
search(){
|
||||
this.tenderData = this.dataCopy;
|
||||
this.loading = true;
|
||||
if (!this.searchTerm || this.searchTerm == null || this.searchTerm == undefined || this.searchTerm == "") {
|
||||
this._ui.toastMessage(this.errorService.translate('enterSearchTerm'), 3000);
|
||||
this.getData();
|
||||
return;
|
||||
}
|
||||
this.tenderData = this.tenderData.filter(res => {
|
||||
let includedInTitle = (res.title) ? res.title.toLowerCase().includes(this.searchTerm.toLowerCase()) : false;
|
||||
let includedInPublishDate = (res.publishDate) ? res.publishDate.includes(this.searchTerm.toLowerCase()) : false;
|
||||
|
||||
let includedInbidOpenDate = (res.bidOpenDate) ? res.bidOpenDate.includes(this.searchTerm.toLowerCase()) : false;
|
||||
|
||||
if (includedInTitle)
|
||||
return true;
|
||||
if (includedInPublishDate)
|
||||
return true;
|
||||
if (includedInbidOpenDate)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
});
|
||||
this.noData = (this.tenderData && this.tenderData.length == 0) ? true : false;
|
||||
this.pageLength = this.tenderData.length;
|
||||
this.dataSource = new MatTableDataSource(this.tenderData);
|
||||
this.loading = false;
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
|
||||
reset(){
|
||||
this.searchTerm = "";
|
||||
this.getData();
|
||||
}
|
||||
|
||||
sortData(sort: Sort) {
|
||||
|
||||
const data = this.tenderData.slice();
|
||||
if (!sort.active || sort.direction === '') {
|
||||
this.dataSource.data = data;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
this.dataSource.data = data.sort((a, b) => {
|
||||
const isAsc = sort.direction === 'asc';
|
||||
switch (sort.active) {
|
||||
case 'title':
|
||||
return compare(a.title, b.title, isAsc);
|
||||
case 'publishedDate':
|
||||
return compare(a.publishDate, b.publishDate, isAsc);
|
||||
case 'bidOpenDate':
|
||||
return compare(a.bidOpenDate, b.bidOpenDate, isAsc);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
// public getUser(): Observable<User> {
|
||||
// return of({
|
||||
// email: localStorage.getItem('username'),
|
||||
// name: localStorage.getItem('username'),
|
||||
|
||||
// });
|
||||
// }
|
||||
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
function compare(a: any, b: any, isAsc: boolean): number {
|
||||
return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { ForgotPasswordComponent } from './forgot-password/forgot-password.component';
|
||||
import { LoginComponent } from './login/login.component';
|
||||
import { AdminHomeComponent } from './admin-home/admin-home.component';
|
||||
import { ViewComponent } from './view/view.component';
|
||||
import { UploadComponent } from './upload/upload.component';
|
||||
import { RegisterComponent } from './register/register.component';
|
||||
|
||||
const routes: Routes = [
|
||||
{ path: '', redirectTo: 'admin-home', pathMatch: 'full' },
|
||||
{ path: 'admin-home', component: AdminHomeComponent },
|
||||
{ path: 'login', component: LoginComponent },
|
||||
{ path: 'view/:id', component: ViewComponent },
|
||||
{ path: 'upload', component: UploadComponent },
|
||||
{ path: 'reset-password', component: ForgotPasswordComponent },
|
||||
{ path: 'register', component: RegisterComponent }
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forChild(routes)],
|
||||
exports: [RouterModule]
|
||||
})
|
||||
export class AuthRoutingModule { }
|
||||
export const authComponents = [
|
||||
AdminHomeComponent,
|
||||
LoginComponent,
|
||||
ForgotPasswordComponent,
|
||||
RegisterComponent
|
||||
];
|
||||
@ -0,0 +1,63 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
import { authComponents, AuthRoutingModule } from './auth-routing.module';
|
||||
import { MatCardModule } from '@angular/material/card';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatToolbarModule } from '@angular/material/toolbar';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { MatDatepickerModule } from '@angular/material/datepicker';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { NgOtpInputModule } from 'ng-otp-input';
|
||||
import { ViewComponent } from './view/view.component';
|
||||
import { UploadComponent } from './upload/upload.component';
|
||||
import { RegisterComponent } from './register/register.component';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
<<<<<<< HEAD
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatPaginatorModule } from '@angular/material/paginator';
|
||||
import { MatSortModule } from '@angular/material/sort';
|
||||
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
// import { AdminHomeComponent } from './admin-home/admin-home.component';
|
||||
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
authComponents,
|
||||
ViewComponent,
|
||||
UploadComponent,
|
||||
RegisterComponent,
|
||||
// AdminHomeComponent
|
||||
],
|
||||
imports: [
|
||||
CommonModule,
|
||||
AuthRoutingModule,
|
||||
MatCardModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
MatInputModule,
|
||||
MatIconModule,
|
||||
MatButtonModule,
|
||||
MatToolbarModule,
|
||||
MatSelectModule,
|
||||
MatDatepickerModule,
|
||||
MatProgressBarModule,
|
||||
TranslateModule,
|
||||
NgOtpInputModule,
|
||||
<<<<<<< HEAD
|
||||
MatFormFieldModule,
|
||||
MatTableModule,
|
||||
MatPaginatorModule,
|
||||
MatSortModule
|
||||
=======
|
||||
MatFormFieldModule
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
]
|
||||
})
|
||||
export class AuthModule { }
|
||||
@ -0,0 +1,80 @@
|
||||
<div class="c-wrapper">
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="container" style="margin-top:50px;">
|
||||
<div class="row">
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-5 col-xl-4">
|
||||
<mat-card card="card-style">
|
||||
<!-- <mat-card-title>
|
||||
<div class="row">
|
||||
<img mat-card-image src="assets/accurate/images/salesapp.png" alt="logo">
|
||||
</div>
|
||||
</mat-card-title> -->
|
||||
<mat-card-subtitle style="text-align: center;">
|
||||
<b> {{ 'resetPassword' | translate | uppercase }} </b>
|
||||
</mat-card-subtitle>
|
||||
<mat-card-content>
|
||||
<form *ngIf="!isNewPasswordScreen" [formGroup]="loginForm" (ngSubmit)="onVerifyOtp()">
|
||||
<p>
|
||||
<mat-form-field>
|
||||
<input type="text" matInput placeholder="{{ 'email' | translate }}"
|
||||
[disabled]="isVisibleOtp"
|
||||
formControlName="username" [(ngModel)]="user.username" style="width:100%">
|
||||
</mat-form-field>
|
||||
</p>
|
||||
<p *ngIf="isVisibleOtp">
|
||||
|
||||
<mat-label> Passcode </mat-label>
|
||||
<ng-otp-input (onInputChange)="onOtpChange($event)" [config]="config">
|
||||
</ng-otp-input>
|
||||
</p>
|
||||
|
||||
<div class="button">
|
||||
<button *ngIf="!isVisibleOtp" mat-raised-button style="color: rgb(255, 255, 255);background-color: #212529;" type="button"
|
||||
(click)="sendOTP()"> {{ 'sendOtp' | translate }}
|
||||
</button>
|
||||
<button *ngIf="isVisibleOtp" mat-raised-button style="color: rgb(255, 255, 255);background-color: #212529;" type="submit"> {{
|
||||
'verifyOtp' | translate }}
|
||||
</button>
|
||||
<button *ngIf="isVisibleOtp" mat-raised-button style="color: rgb(255, 255, 255);background-color: #212529;" type="button"
|
||||
style="margin-left: 5px;" (click)="resendOTP()"> {{ 'resendOtp' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
<div style="text-align: center;padding-top: 20px;">
|
||||
<a [routerLink]="" style="color: #ae1c1c;text-decoration: auto;" (click)="goToLogin()">{{ 'login' | translate }}</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<form *ngIf="isNewPasswordScreen" [formGroup]="loginForm" (ngSubmit)="onSubmit()">
|
||||
|
||||
<p>
|
||||
<mat-form-field>
|
||||
<input type="password" matInput placeholder="{{ 'password' | translate }}"
|
||||
formControlName="password" [(ngModel)]="user.password" style="width:100%">
|
||||
</mat-form-field>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<mat-form-field>
|
||||
<input type="password" matInput
|
||||
placeholder="{{ 'confirmPassword' | translate }}" formControlName="confpassword"
|
||||
[(ngModel)]="user.confpassword" style="width:100%">
|
||||
</mat-form-field>
|
||||
</p>
|
||||
|
||||
<div class="button">
|
||||
<button mat-raised-button style="color: rgb(255, 255, 255);background-color: #212529;" type="submit"> {{ 'changePassword' |
|
||||
translate }}
|
||||
</button>
|
||||
</div>
|
||||
<div style="text-align: center;padding-top: 20px;">
|
||||
<a [routerLink]="" style="color: #ae1c1c;text-decoration: auto;" (click)="goToLogin()">{{ 'login' | translate }}</a>
|
||||
</div>
|
||||
</form>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -0,0 +1,45 @@
|
||||
|
||||
|
||||
.row{
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-style {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 100px 0px;
|
||||
}
|
||||
|
||||
.mat-form-field {
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
// min-width: 300px;
|
||||
|
||||
input {
|
||||
// height: 5vh;
|
||||
width: 100%;
|
||||
// background-color: aliceblue;
|
||||
border-bottom: 1px solid silver;
|
||||
}
|
||||
}
|
||||
|
||||
mat-card-title,
|
||||
mat-card-content {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.error {
|
||||
padding: 16px;
|
||||
width: 300px;
|
||||
color: white;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.button {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
@ -0,0 +1,195 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { AuthenticationDto } from 'src/app/_dto/authentication.dto';
|
||||
import { AuthService } from 'src/app/_providers/_services/auth.service';
|
||||
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-forgot-password',
|
||||
templateUrl: './forgot-password.component.html',
|
||||
styleUrls: ['./forgot-password.component.scss']
|
||||
})
|
||||
export class ForgotPasswordComponent implements OnInit {
|
||||
|
||||
img: string;
|
||||
|
||||
loginForm: FormGroup;
|
||||
|
||||
user: AuthenticationDto = new AuthenticationDto();
|
||||
|
||||
config = {
|
||||
allowNumbersOnly: true,
|
||||
length: 6,
|
||||
inputStyles: {
|
||||
width: "25px",
|
||||
height: "25px",
|
||||
},
|
||||
}
|
||||
otpValue: any;
|
||||
|
||||
isVisibleOtp: boolean = false;
|
||||
|
||||
loading: boolean = false;
|
||||
|
||||
timeOut: boolean = false;
|
||||
|
||||
timeLeft: number;
|
||||
|
||||
time: any;
|
||||
|
||||
isNewPasswordScreen: boolean = false;
|
||||
|
||||
institute: any;
|
||||
|
||||
constructor(
|
||||
private _activeRouter: ActivatedRoute,
|
||||
private formBuilder: FormBuilder,
|
||||
private _ui: UiService,
|
||||
private errorTranslateService: ErrorTranslateService,
|
||||
private service: AuthService,
|
||||
private router: Router
|
||||
) { }
|
||||
|
||||
async ngOnInit() {
|
||||
|
||||
this.loginForm = this.formBuilder.group({
|
||||
username: [''],
|
||||
password: [''],
|
||||
confpassword: [''],
|
||||
});
|
||||
|
||||
await this._activeRouter.queryParams
|
||||
.subscribe(
|
||||
async (params) => {
|
||||
let school = params.school;
|
||||
this.institute = params.school;
|
||||
this.img = "../../../../assets/accurate/images/" + school + ".png"
|
||||
});
|
||||
}
|
||||
|
||||
async sendOTP() {
|
||||
this.timeOut = true;
|
||||
if (!this.user.username || this.user.username.trim() == "") {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("userNameCantbeBlank"));
|
||||
this.loading = false;
|
||||
this.timeOut = false;
|
||||
return;
|
||||
}
|
||||
if (!this._ui.emailValidation(this.user.username)) {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("enterAValidEmailID"));
|
||||
return;
|
||||
}
|
||||
|
||||
await this.service.sendOtp({ email: this.user.username }, 'F').then(res => {
|
||||
this.loading = false;
|
||||
this.isVisibleOtp = true;
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("otpSendSuccess"));
|
||||
}, (err) => {
|
||||
this.timeOut = false;
|
||||
console.log("-------err-----", err);
|
||||
this._ui.toastMessage(err.message ? err.error.message : this.errorTranslateService.translate('errInSave'), 3000);
|
||||
});
|
||||
this.setTimer()
|
||||
}
|
||||
|
||||
setTimer() {
|
||||
console.log("here");
|
||||
this.timeLeft = 300;
|
||||
this.time = setInterval(() => {
|
||||
if (this.timeLeft > 0) {
|
||||
this.timeLeft--;
|
||||
} else {
|
||||
this.timeOut = false;
|
||||
clearInterval(this.time);
|
||||
}
|
||||
}, 1000)
|
||||
|
||||
}
|
||||
|
||||
async onVerifyOtp() {
|
||||
if (!this.otpValue || this.otpValue.length != 6) {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("enterValidOtp"));
|
||||
return
|
||||
}
|
||||
if (this.otpValue && this.user.username) {
|
||||
let body: { otp: string, email: string } = { otp: '', email: '' };
|
||||
body.otp = this.otpValue;
|
||||
body.email = this.user.username;
|
||||
await this.service.verifyOtp(body, 'F').then(res => {
|
||||
// this.visibleOtp = false;
|
||||
// this.showNewPassword = true;
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("otpVerifiedSuccess"));
|
||||
|
||||
this.isNewPasswordScreen = true;
|
||||
}, (err) => {
|
||||
console.log("-------err-----", err);
|
||||
this._ui.toastMessage(err.message ? err.error.message : this.errorTranslateService.translate('errInSave'), 3000);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
async resendOTP() {
|
||||
this.timeOut = true;
|
||||
this.otpValue = null;
|
||||
this.setTimer();
|
||||
setTimeout(() => {
|
||||
}, 0);
|
||||
if (this.user.username && !(this.user.username.trim() == "")) {
|
||||
await this.service.sendOtp({ email: this.user.username }, 'FR').then(async res => {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("otpSendSuccess"));
|
||||
}, (err) => {
|
||||
this._ui.toastMessage(err.message ? err.error.message : this.errorTranslateService.translate('errInSave'), 3000);
|
||||
})
|
||||
}
|
||||
else
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("userNameCantbeBlank"));
|
||||
}
|
||||
|
||||
onOtpChange(otp) {
|
||||
this.otpValue = otp;
|
||||
console.log("==otp==", this.otpValue.length);
|
||||
}
|
||||
|
||||
goToLogin() {
|
||||
this.router.navigate(["auth/login"]);
|
||||
}
|
||||
|
||||
async passwordPreSave(): Promise<boolean> {
|
||||
if (!this.user.password || this.user.password == "" || this.user.password.trim() == "") {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("passwordCantbeBlank"));
|
||||
return false;
|
||||
}
|
||||
if (this.user.password.length < 6) {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("minimumPasswordLenght"));
|
||||
return false;
|
||||
}
|
||||
if (!this.user.confpassword || this.user.confpassword == "" || this.user.confpassword.trim() == "") {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("confirmPasswordCantbeBlank"));
|
||||
return false;
|
||||
}
|
||||
if (this.user.password != this.user.confpassword) {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("passwordMismatch"));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
async onSubmit() {
|
||||
if (!(await this.passwordPreSave())) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.service.forgotPassword({ pass: this.user.password, email: this.user.username, otp: this.otpValue }).then(async (res) => {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("passwordChangeSuccess"));
|
||||
await this.router.navigate(["auth/login"]);
|
||||
|
||||
}, (err) => {
|
||||
console.log("--", err);
|
||||
this._ui.toastMessage(err.message ? err.error.message : this.errorTranslateService.translate('errInSave'), 3000);
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,108 @@
|
||||
<div class="c-wrapper" style="margin:0">
|
||||
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToHome()">Home</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav> -->
|
||||
|
||||
<mat-progress-bar mode="indeterminate" *ngIf="loading" color="warn"></mat-progress-bar>
|
||||
<!-- <nav class="navbar navbar-dark-responsive" style="background-image: url('assets/img/panel_background.jpg');padding: 56px;">
|
||||
</nav> -->
|
||||
<div class="container">
|
||||
|
||||
<div class="container" style="margin-top:20px;">
|
||||
<div class="row">
|
||||
<!-- <div class="col-sm-4 col-md-4 col-lg-4 col-xl-4"></div> -->
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-5 col-xl-4">
|
||||
<mat-card card="card-style">
|
||||
<mat-card-title>
|
||||
<div class="row">
|
||||
<!-- <img mat-card-image src="assets/accurate/images/salesapp.png" alt="logo"> -->
|
||||
|
||||
</div>
|
||||
</mat-card-title>
|
||||
<mat-card-subtitle style="text-align: center;">
|
||||
<b> {{ 'signIn' | translate | uppercase }} </b>
|
||||
</mat-card-subtitle>
|
||||
<mat-card-content>
|
||||
<form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
|
||||
<p>
|
||||
<mat-form-field>
|
||||
<input type="text" matInput placeholder="{{ 'email' | translate }}"
|
||||
formControlName="username" [(ngModel)]="user.username" style="width:100%">
|
||||
</mat-form-field>
|
||||
</p>
|
||||
<p style="margin-bottom: 0;">
|
||||
<mat-form-field>
|
||||
<input type="password" matInput placeholder="{{ 'password' | translate }}"
|
||||
formControlName="password" [(ngModel)]="user.password" style="width:100%">
|
||||
</mat-form-field>
|
||||
|
||||
</p>
|
||||
|
||||
<div style="text-align: right;margin-bottom: 20px;margin-top: -10px;">
|
||||
<a (click)="goToForgotPassword()" style="font-size: small;color: #ae1c1c;text-decoration: auto;">{{'forgotPass' | translate}}</a>
|
||||
</div>
|
||||
|
||||
<div class="button">
|
||||
<button mat-raised-button style="color: rgb(255, 255, 255);background-color: #212529;width: 100%;" type="submit"> {{ 'login' | translate }}
|
||||
<!-- <i class="bi bi-person-plus-fill"></i> -->
|
||||
</button>
|
||||
</div>
|
||||
<!-- <div style="text-align: center;padding-top: 5px; ">
|
||||
<p color="dark" [routerLink]="" (click)="goToForgotPassword()">Reset password</p>
|
||||
</div> -->
|
||||
|
||||
|
||||
|
||||
<br>
|
||||
<div style="text-align: center;">
|
||||
<p>No Account? <a (click)="goToRegister()" style="color: #ae1c1c;text-decoration: auto;">Create One</a></p>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
</div>
|
||||
<!-- <div class="col-sm-4"></div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- <div class="footer" class="fixed-bottom">
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;" class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023. </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>
|
||||
</footer>
|
||||
</div> -->
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
// :host {
|
||||
// display: flex;
|
||||
// justify-content: center;
|
||||
// margin: 100px 0px;
|
||||
// }
|
||||
.custom-toolbar {
|
||||
margin:0
|
||||
}
|
||||
|
||||
.row{
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-style {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 100px 0px;
|
||||
}
|
||||
|
||||
.mat-form-field {
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
// min-width: 300px;
|
||||
|
||||
input {
|
||||
// height: 5vh;
|
||||
width: 100%;
|
||||
// background-color: aliceblue;
|
||||
border-bottom: 1px solid silver;
|
||||
}
|
||||
}
|
||||
|
||||
mat-card-title,
|
||||
mat-card-content {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.error {
|
||||
padding: 16px;
|
||||
width: 300px;
|
||||
color: white;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.nav-link:hover {
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
.button {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
|
||||
.img-fluid {
|
||||
margin-right: 5px;
|
||||
max-height: 40px;
|
||||
}
|
||||
|
||||
|
||||
.fixed-bottom {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
@ -0,0 +1,190 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
|
||||
import { AuthenticationDto } from 'src/app/_dto/authentication.dto';
|
||||
import { routePath } from 'src/app/_providers/_resources/route-path.properties';
|
||||
import { AuthService } from 'src/app/_providers/_services/auth.service';
|
||||
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-login',
|
||||
templateUrl: './login.component.html',
|
||||
styleUrls: ['./login.component.scss']
|
||||
})
|
||||
export class LoginComponent implements OnInit {
|
||||
|
||||
user: AuthenticationDto = new AuthenticationDto();
|
||||
loginForm: FormGroup;
|
||||
loading = false;
|
||||
submitted = false;
|
||||
returnUrl: string;
|
||||
error = '';
|
||||
id: string;
|
||||
img: string;
|
||||
|
||||
|
||||
|
||||
constructor(
|
||||
private service: AuthService,
|
||||
private formBuilder: FormBuilder,
|
||||
private router: Router,
|
||||
private route: ActivatedRoute,
|
||||
private _ui: UiService,
|
||||
private errorTranslateService: ErrorTranslateService,
|
||||
private _activeRouter: ActivatedRoute
|
||||
) { }
|
||||
|
||||
ngOnInit() {
|
||||
this._activeRouter.paramMap.subscribe(async (param: ParamMap) => {
|
||||
if (param.get('id')) {
|
||||
this.id = param.get('id');
|
||||
localStorage.setItem('institute', this.id)
|
||||
this.img = "../../../../assets/accurate/images/" + this.id + ".png"
|
||||
}
|
||||
|
||||
})
|
||||
this.loginForm = this.formBuilder.group({
|
||||
username: ['', Validators.required],
|
||||
password: ['', Validators.required]
|
||||
});
|
||||
|
||||
// get return url from route parameters or default to '/'
|
||||
this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
|
||||
}
|
||||
|
||||
// openSnackBar(message: string, action: string) {
|
||||
// this._snackBar.open(message, action);
|
||||
// }
|
||||
|
||||
|
||||
// convenience getter for easy access to form fields
|
||||
get f() { return this.loginForm.controls; }
|
||||
|
||||
preSave() {
|
||||
if (!this.user.username || this.user.username == null) {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("userNameCantbeBlank"));
|
||||
return false;
|
||||
}
|
||||
if (!this.user.password || this.user.password == null) {
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("passwordCantbeBlank"));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
goToHome(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
|
||||
onSubmit() {
|
||||
if (!this.preSave())
|
||||
return
|
||||
this.loading = true;
|
||||
console.log("loading", this.loading);
|
||||
this.error = "";
|
||||
this.submitted = true;
|
||||
// this.user.username = this.user.username.toUpperCase();
|
||||
// stop here if form is invalid
|
||||
if (this.loginForm.invalid) {
|
||||
this.loading = false;
|
||||
console.log("loading", this.loading);
|
||||
return;
|
||||
}
|
||||
|
||||
this.service.signIn(this.user)
|
||||
.then(async (res: any) => {
|
||||
// localStorage.setItem('seculevel', res.seculevel);
|
||||
localStorage.setItem('authtoken', res.accessToken);
|
||||
localStorage.setItem('refreshtoken', res.refreshToken);
|
||||
localStorage.setItem('emailId', res.emailId);
|
||||
console.log("==seclevel==", res.seculevel);
|
||||
|
||||
await this._ui.getUserInfo({ username: this.user.username }).then((res) => {
|
||||
console.log("fFFf",res);
|
||||
|
||||
localStorage.setItem('username', res.username);
|
||||
localStorage.setItem('seculevel', res.secuLevel);
|
||||
}, (err) => {
|
||||
console.log("err=1=", err);
|
||||
this._ui.toastMessage((err.error.message) ? err.error.message : this.errorTranslateService.translate('errorInApi'));
|
||||
});
|
||||
|
||||
this.router.navigate([routePath.dashboard]);
|
||||
// this.service.patchToken()
|
||||
this.user.password = '';
|
||||
this.error = '';
|
||||
|
||||
}, (err) => {
|
||||
this.loading = false;
|
||||
console.log("=== here=err==", err);
|
||||
localStorage.setItem('authtoken', '');
|
||||
localStorage.setItem('refreshtoken', '');
|
||||
localStorage.setItem('emailId', '');
|
||||
localStorage.removeItem('authtoken');
|
||||
localStorage.removeItem('refreshtoken');
|
||||
localStorage.removeItem('media');
|
||||
localStorage.removeItem('emailId');
|
||||
localStorage.removeItem('passwordVersion');
|
||||
|
||||
if (err.status == 0) {
|
||||
this.error = "* Failed to load Database";
|
||||
this.loading = false;
|
||||
setTimeout(() => {
|
||||
this.error = ''
|
||||
}, 3000);
|
||||
} else if (err.status == 422) {
|
||||
this.error = "* Not Registered";
|
||||
this.loading = false;
|
||||
setTimeout(() => {
|
||||
this.error = ''
|
||||
}, 3000);
|
||||
}
|
||||
else if (err.status == 500) {
|
||||
this.error = "* Invalid Credentials";
|
||||
this.loading = false;
|
||||
setTimeout(() => {
|
||||
this.error = ''
|
||||
}, 3000);
|
||||
}
|
||||
else if (err.status == 400) {
|
||||
this.error = err.error.message;
|
||||
this.loading = false;
|
||||
setTimeout(() => {
|
||||
this.error = ''
|
||||
}, 3000);
|
||||
}
|
||||
else if (err.status == 401) {
|
||||
this.error = err.error.message;
|
||||
this.loading = false;
|
||||
setTimeout(() => {
|
||||
this.error = ''
|
||||
}, 3000);
|
||||
}
|
||||
else {
|
||||
// if (isArray(err.error.message)) {
|
||||
// const error = err.error.message[0].constraints;
|
||||
// if (error?.minLength)
|
||||
// this.error = '* ' + error.minLength;
|
||||
// this.loading = false;
|
||||
// } else {
|
||||
// this.error = '* ' + err.error.message;
|
||||
// this.loading = false;
|
||||
// }
|
||||
}
|
||||
this._ui.toastMessage(this.error, 2000);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async goToRegister() {
|
||||
await this.router.navigate(["auth/register"]);
|
||||
}
|
||||
|
||||
async goToForgotPassword() {
|
||||
await this.router.navigate(["auth/reset-password"], { queryParams: {school:this.id} });
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,170 @@
|
||||
<div class="c-wrapper" style="margin:0">
|
||||
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" >Home</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" >Contact Us</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<nav class="navbar navbar-dark-responsive" style="background-image: url('assets/img/panel_background.jpg');padding: 56px;">
|
||||
</nav> -->
|
||||
<mat-progress-bar mode="indeterminate" *ngIf="loading" color="warn"></mat-progress-bar>
|
||||
|
||||
|
||||
<div *ngIf="!verifiedOtp" class="container">
|
||||
|
||||
<div class="container" style="margin-top:20px;">
|
||||
<div class="row">
|
||||
<!-- <div class="col-sm-4 col-md-4 col-lg-4 col-xl-4"></div> -->
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-7 col-xl-7">
|
||||
<mat-card card="card-style">
|
||||
<mat-card-title>
|
||||
<div class="row">
|
||||
<!-- <img mat-card-image src="assets/accurate/images/salesapp.png" alt="logo"> -->
|
||||
|
||||
</div>
|
||||
</mat-card-title>
|
||||
<mat-card-subtitle style="text-align: center;">
|
||||
<b> {{ 'register' | translate | uppercase }} </b>
|
||||
</mat-card-subtitle>
|
||||
<mat-card-content>
|
||||
<div class="row">
|
||||
|
||||
|
||||
<div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10">
|
||||
<mat-form-field style="width: 100%">
|
||||
<input matInput [(ngModel)]="this.userDetails.email" type="text" placeholder="{{ 'email' | translate }}">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<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)="sendOTP(otpValidation)"
|
||||
style="color: darkred;">{{ 'generateOtp' | translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
</div>
|
||||
<!-- <div class="col-sm-4"></div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<ng-template #otpValidation>
|
||||
|
||||
<div class="row">
|
||||
|
||||
|
||||
<div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10">
|
||||
<mat-form-field style="width: 100%">
|
||||
<input matInput [(ngModel)]="this.userDetails.otp" type="text" placeholder="{{ 'enterOtp' | translate }}">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<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()" style="color: darkred;">{{ 'submit' |
|
||||
translate }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</ng-template>
|
||||
|
||||
|
||||
<div *ngIf="verifiedOtp">
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="container" style="margin-top:20px;">
|
||||
<div class="row">
|
||||
<!-- <div class="col-sm-4 col-md-4 col-lg-4 col-xl-4"></div> -->
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-7 col-xl-7">
|
||||
<mat-card card="card-style">
|
||||
<mat-card-title>
|
||||
<div class="row">
|
||||
<!-- <img mat-card-image src="assets/accurate/images/salesapp.png" alt="logo"> -->
|
||||
|
||||
</div>
|
||||
</mat-card-title>
|
||||
<mat-card-subtitle style="text-align: center;">
|
||||
<b> {{ 'register' | translate | uppercase }} </b>
|
||||
</mat-card-subtitle>
|
||||
<mat-card-content>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10">
|
||||
<mat-form-field style="width: 100%">
|
||||
<input matInput [(ngModel)]="this.userDetails.userName" type="text" placeholder="{{ 'name' | translate }}">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<!-- <div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10">
|
||||
<mat-form-field style="width: 100%">
|
||||
<input matInput type="text" placeholder="{{ 'email' | translate }}">
|
||||
</mat-form-field>
|
||||
</div> -->
|
||||
|
||||
<div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10">
|
||||
<mat-form-field style="width: 100%">
|
||||
<input matInput [(ngModel)]="this.userDetails.mobileNumber" type="text" placeholder="{{ 'mobileNumber' | translate }}">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10">
|
||||
<mat-form-field style="width: 100%">
|
||||
<input matInput [(ngModel)]="this.userDetails.pass" type="password" placeholder="{{ 'password' | translate }}">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div class="col-10 col-sm-10 col-md-12 col-lg-10 col-xl-10">
|
||||
<mat-form-field style="width: 100%">
|
||||
<input matInput [(ngModel)]="this.userDetails.confPass" type="password" placeholder="{{ 'confPass' | translate }}">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<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)="saveData()" style="color: darkred;">{{ 'register' | translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
</div>
|
||||
<!-- <div class="col-sm-4"></div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="footer" class="fixed-bottom">
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;" class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023. </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>
|
||||
</footer>
|
||||
</div> -->
|
||||
@ -0,0 +1,71 @@
|
||||
// :host {
|
||||
// display: flex;
|
||||
// justify-content: center;
|
||||
// margin: 100px 0px;
|
||||
// }
|
||||
.custom-toolbar {
|
||||
margin:0
|
||||
}
|
||||
|
||||
.row{
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-style {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 100px 0px;
|
||||
}
|
||||
|
||||
.mat-form-field {
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
// min-width: 300px;
|
||||
|
||||
input {
|
||||
// height: 5vh;
|
||||
width: 100%;
|
||||
// background-color: aliceblue;
|
||||
border-bottom: 1px solid silver;
|
||||
}
|
||||
}
|
||||
|
||||
mat-card-title,
|
||||
mat-card-content {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.error {
|
||||
padding: 16px;
|
||||
width: 300px;
|
||||
color: white;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.nav-link:hover {
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
.button {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
|
||||
.img-fluid {
|
||||
margin-right: 5px;
|
||||
max-height: 40px;
|
||||
}
|
||||
|
||||
|
||||
.fixed-bottom {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
@ -0,0 +1,156 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { Router } from '@angular/router';
|
||||
import { PcdUserDto } from 'src/app/_dto/pcduser.dto';
|
||||
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
|
||||
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
|
||||
import { MasterService } from 'src/app/_providers/_services/master.service';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
import Swal from 'sweetalert2'
|
||||
@Component({
|
||||
selector: 'app-register',
|
||||
templateUrl: './register.component.html',
|
||||
styleUrls: ['./register.component.scss']
|
||||
})
|
||||
|
||||
|
||||
export class RegisterComponent implements OnInit {
|
||||
|
||||
|
||||
loading = true
|
||||
|
||||
verifiedOtp: boolean = false;
|
||||
|
||||
dialogRef: any;
|
||||
|
||||
userDetails = new PcdUserDto()
|
||||
|
||||
constructor(
|
||||
private dialog: MatDialog,
|
||||
private _masterService: MasterService,
|
||||
private _uiService: UiService,
|
||||
private errorTranslateService: ErrorTranslateService,
|
||||
private router: Router
|
||||
) { }
|
||||
|
||||
ngOnInit(): void {
|
||||
this.loading = false
|
||||
}
|
||||
|
||||
sendOTP(template) {
|
||||
if (this.userDetails.email && this._uiService.emailValidation(this.userDetails.email)) {
|
||||
let body = { email: this.userDetails.email };
|
||||
this._masterService.saveAllMasterData(apiUrl.registerOtp, body).then(res => {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate("otpSendSuccessfully"));
|
||||
|
||||
this.openDialogbox(template)
|
||||
},err=>{
|
||||
this._uiService.toastMessage((err.error.message) ? err.error.message : this.errorTranslateService.translate('errorInApi'));
|
||||
|
||||
})
|
||||
}
|
||||
else {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate("enterAValidEmailID"));
|
||||
}
|
||||
}
|
||||
|
||||
openDialogbox(templateRef) {
|
||||
console.log('this');
|
||||
this.dialogRef = this.dialog.open(templateRef, {
|
||||
width: '400px',
|
||||
disableClose: false
|
||||
});
|
||||
// this.verifiedOtp = true
|
||||
}
|
||||
|
||||
|
||||
validation() {
|
||||
|
||||
if (this.userDetails.otp) {
|
||||
let body = {
|
||||
email: this.userDetails.email,
|
||||
otp: this.userDetails.otp
|
||||
}
|
||||
this._masterService.saveAllMasterData(apiUrl.validateRegisterOtp, body).then(res => {
|
||||
if (res['data'] == 'success') {
|
||||
Swal.fire(
|
||||
'Verified',
|
||||
'OTP Verified Successfully',
|
||||
'success'
|
||||
)
|
||||
this.dialogRef.close()
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate("otpVerifiedSuccess"));
|
||||
this.verifiedOtp = true
|
||||
}
|
||||
else {
|
||||
this.dialogRef.close();
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate("otpMismatching"));
|
||||
}
|
||||
},err=>{
|
||||
|
||||
this._uiService.toastMessage((err.error.message) ? err.error.message : this.errorTranslateService.translate('errorInApi'));
|
||||
|
||||
})
|
||||
}
|
||||
else {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate("enterOTP"));
|
||||
}
|
||||
|
||||
}
|
||||
navigateTo(destination) {
|
||||
this.router.navigate([destination]);
|
||||
}
|
||||
|
||||
preSave() {
|
||||
if (!this.userDetails.userName || this.userDetails.userName == null || this.userDetails.userName == "" ||this.userDetails.userName == undefined) {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('userNameCantbeBlank'), 3000);
|
||||
return false;
|
||||
}
|
||||
if (!this.userDetails.mobileNumber || this.userDetails.mobileNumber == null || this.userDetails.mobileNumber == "" ||this.userDetails.mobileNumber == undefined) {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('phonecantBeBlank'), 3000);
|
||||
return false;
|
||||
}
|
||||
if (!this._uiService.phoneNoValidation(this.userDetails.mobileNumber) ) {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('enterAValidPhoneNumber'), 3000);
|
||||
return false;
|
||||
}
|
||||
if (!this.userDetails.pass || this.userDetails.pass == null || this.userDetails.pass == "" ||this.userDetails.pass == undefined) {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('passwordCantbeBlank'), 3000);
|
||||
return false;
|
||||
}
|
||||
if (this.userDetails.pass.length < 6) {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('minimumPasswordLenght'), 3000);
|
||||
return false;
|
||||
}
|
||||
if (!this.userDetails.confPass || this.userDetails.confPass == null || this.userDetails.confPass == "" ||this.userDetails.confPass == undefined) {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('confirmPasswordCantbeBlank'), 3000);
|
||||
return false;
|
||||
}
|
||||
if (this.userDetails.pass != this.userDetails.confPass) {
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('passwordMismatch'), 3000);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
saveData(){
|
||||
if (!this.preSave())
|
||||
return;
|
||||
|
||||
delete this.userDetails.confPass
|
||||
this.loading = true;
|
||||
this._masterService.saveMasterData(apiUrl.signup,this.userDetails).then(res=>{
|
||||
this.loading = false
|
||||
this._uiService.toastMessage(this.errorTranslateService.translate('saveSuccess'), 3000);
|
||||
this.verifiedOtp = false
|
||||
this.userDetails = new PcdUserDto();
|
||||
this.navigateTo('/auth/login')
|
||||
},err=>{
|
||||
this.loading = false;
|
||||
this._uiService.toastMessage((err.error.message) ? err.error.message : this.errorTranslateService.translate('errorInApi'));
|
||||
this.verifiedOtp = false
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,156 @@
|
||||
<div class="container-responsive">
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link tender-link" (click)="navigateTo('auth/admin-home')">Tender</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToHome()">Home</p>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<nav class="navbar navbar-dark-responsive"
|
||||
style="background-image: url('assets/img/panel_background.jpg');padding: 50px;"> -->
|
||||
<!-- <div class="container-fluid">
|
||||
<a class="navbar-brand" (click)="navigateTo('tender-view')">
|
||||
<h6>Home / Tender</h6>
|
||||
</a>
|
||||
</div> -->
|
||||
|
||||
<!-- </nav> -->
|
||||
<mat-progress-bar *ngIf="loading" mode="indeterminate" color="warn"></mat-progress-bar>
|
||||
<br>
|
||||
<div class="text-center mt-4">
|
||||
<h2 class="font-weight-bold " style="color: #5faca1;">Upload Files <i class="bi bi-cloud-upload"></i></h2>
|
||||
</div><br>
|
||||
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-6 offset-sm-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="form-group">
|
||||
<form (ngSubmit)="submitForm()" #myForm="ngForm">
|
||||
<div class="form-group">
|
||||
<label for="name">Name</label>
|
||||
<input type="text" class="form-control" id="name" placeholder="Enter your name" [(ngModel)]="formData.name" name="name" required>
|
||||
<div *ngIf="myForm.submitted && myForm.controls.name.errors">
|
||||
<div *ngIf="myForm.controls.name.errors.required" class="text-danger">
|
||||
Name is required.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="phone">Phone Number</label>
|
||||
<input type="text" class="form-control" id="phone" placeholder="Enter your phone number" [(ngModel)]="formData.phone" name="phone" required pattern="[0-9]{10}" [ngModelOptions]="{ updateOn: 'blur' }" (input)="validatePhoneNumber()">
|
||||
<!-- Error messages for required and pattern -->
|
||||
<div *ngIf="myForm.submitted && myForm.controls.phone.errors">
|
||||
<div *ngIf="myForm.controls.phone.errors.required" class="text-danger">
|
||||
Phone number is required.
|
||||
</div>
|
||||
<div *ngIf="myForm.controls.phone.errors.pattern" class="text-danger">
|
||||
Phone number must be a 10-digit number.
|
||||
</div>
|
||||
<div *ngIf="phoneInvalid" class="text-danger">
|
||||
Invalid phone number format.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" class="form-control" id="email" placeholder="Enter your email" [(ngModel)]="formData.email" name="email" required email>
|
||||
<div *ngIf="myForm.submitted && myForm.controls.email.errors">
|
||||
<div *ngIf="myForm.controls.email.errors.required" class="text-danger">
|
||||
Email is required.
|
||||
</div>
|
||||
<div *ngIf="myForm.controls.email.errors.email" class="text-danger">
|
||||
Invalid email format.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="file1">File 1:</label>
|
||||
<div class="input-group">
|
||||
<input type="file" id="file1" class="form-control" aria-describedby="button-addon1" [(ngModel)]="formData.file1" name="file1">
|
||||
<button class="btn btn-outline-secondary delete-btn" (click)="deleteInput('file1')" type="button">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="file2">File 2:</label>
|
||||
<div class="input-group">
|
||||
<input type="file" id="file2" class="form-control" aria-describedby="button-addon1" [(ngModel)]="formData.file2" name="file2">
|
||||
<button class="btn btn-outline-secondary delete-btn" (click)="deleteInput('file2')" type="button">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="form-group">
|
||||
<label for="file3">File 3:</label>
|
||||
<div class="input-group">
|
||||
<input type="file" id="file3" class="form-control" aria-describedby="button-addon1" [(ngModel)]="formData.file3" name="file3">
|
||||
<button class="btn btn-outline-secondary delete-btn" (click)="deleteInput('file3')" type="button">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div> -->
|
||||
<div *ngIf="myForm.submitted && myForm.invalid" class="text-danger">
|
||||
Please fill in all required fields.
|
||||
</div>
|
||||
<button type="submit" class="btn btn-outline-dark float-right" >Submit</button>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<br><br>
|
||||
|
||||
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px;"
|
||||
class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023.
|
||||
</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>
|
||||
</footer>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
@ -0,0 +1,16 @@
|
||||
// .container-responsive {
|
||||
// min-height: 100vh;
|
||||
// position: relative;
|
||||
// }
|
||||
|
||||
// #footer {
|
||||
// background-color: #3a8379;
|
||||
// padding: 20px;
|
||||
// color: #ffffff;
|
||||
// position: absolute;
|
||||
// bottom: 0;
|
||||
// width: 100%;
|
||||
// }
|
||||
.nav-link:hover {
|
||||
color: rgb(255, 0, 0);
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { UploadComponent } from './upload.component';
|
||||
|
||||
describe('UploadComponent', () => {
|
||||
let component: UploadComponent;
|
||||
let fixture: ComponentFixture<UploadComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ UploadComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(UploadComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,68 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormGroup } from '@angular/forms';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
@Component({
|
||||
selector: 'app-upload',
|
||||
templateUrl: './upload.component.html',
|
||||
styleUrls: ['./upload.component.scss']
|
||||
})
|
||||
export class UploadComponent implements OnInit {
|
||||
|
||||
|
||||
phoneInvalid: boolean = false;
|
||||
formData: any = {};
|
||||
myForm: FormGroup;
|
||||
loading: boolean = true
|
||||
|
||||
constructor(private router: Router) { }
|
||||
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
validatePhoneNumber() {
|
||||
const phonePattern = /^[0-9]{10}$/;
|
||||
const phoneInput = this.myForm.controls.phone;
|
||||
this.phoneInvalid = !phonePattern.test(phoneInput.value);
|
||||
}
|
||||
|
||||
// goToHome(){
|
||||
// window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
// }
|
||||
// goToContactUs(){
|
||||
// window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
// }
|
||||
|
||||
preSave(){
|
||||
if(this.formData.name == '' || this.formData.name == undefined){
|
||||
console.log("1");
|
||||
|
||||
return false
|
||||
}
|
||||
if(this.formData.phone == '' || this.formData.phone == undefined || this.formData.phone.length > 10 || this.formData.phone.length < 10){
|
||||
console.log("ph");
|
||||
return false
|
||||
}
|
||||
if(this.formData.email == '' || this.formData.email == undefined){
|
||||
console.log("e");
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
submitForm() {
|
||||
if(this.preSave())
|
||||
console.log(this.formData);
|
||||
}
|
||||
|
||||
deleteInput(inputFieldId: string) {
|
||||
const inputField = document.getElementById(inputFieldId) as HTMLInputElement;
|
||||
if (inputField) {
|
||||
inputField.value = '';
|
||||
}
|
||||
}
|
||||
ngOnInit(): void {
|
||||
this.loading = false
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,548 @@
|
||||
<div class="container-responsive">
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link tender-link" (click)="navigateTo('auth/admin-home')">Tender</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToHome()">Home</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<nav class="navbar navbar-dark-responsive"
|
||||
style="background-image: url('assets/img/panel_background.jpg');padding: 50px;"> -->
|
||||
<!-- <div class="container-fluid"> -->
|
||||
<!-- <a class="navbar-brand" (click)="navigateTo('tender-view')">
|
||||
<h6>Home / Tender</h6>
|
||||
</a> -->
|
||||
<!-- </div> -->
|
||||
|
||||
<!-- </nav> -->
|
||||
<!-- <mat-progress-bar mode="indeterminate" color="warn"></mat-progress-bar> -->
|
||||
<br>
|
||||
<div class="text-center mt-4">
|
||||
<h2 class="font-weight-bold " style="color: #5faca1;">Tender Details </h2>
|
||||
</div><br>
|
||||
|
||||
|
||||
<div class="row d-flex justify-content-center ">
|
||||
<div class="col-sm-11">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Basic Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th >Organisation Name</th>
|
||||
<td class="col-md-6" >{{tenderData.orgChain}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Reference Number</th>
|
||||
<td>{{tenderData.tenderRefNo}}</td>
|
||||
<<<<<<< HEAD
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender ID</th>
|
||||
<td>{{tenderData.tenderId}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Type</th>
|
||||
<td>{{tenderData?.tenderTypeD?.tenderType}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Category</th>
|
||||
<td>{{tenderData?.tenderCategoryD?.tenderCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Payment Mode</th>
|
||||
<td>{{tenderData?.paymentModeD?.paymentMode}}</td>
|
||||
=======
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender ID</th>
|
||||
<td>{{tenderData.productCategoryD.tenderId}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Type</th>
|
||||
<td>{{tenderData.tenderCategoryD.tenderType}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Category</th>
|
||||
<td>{{tenderData.tenderCategoryD.tenderCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Payment Mode</th>
|
||||
<td>{{tenderData.paymentModeD.paymentMode}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Form of Contract</th>
|
||||
<td>{{tenderData.formOfContractD.formOfContract}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>No. of Covers</th>
|
||||
<td>{{tenderData.NoCovers}}</td>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Form of Contract</th>
|
||||
<td>{{tenderData?.formOfContractD?.formOfContract}}</td>
|
||||
</tr>
|
||||
<!-- <tr>
|
||||
<th>No. of Covers</th>
|
||||
<td>{{tenderData.NoCovers}}</td>
|
||||
</tr> -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Tender Fee Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Tender Fee in ₹</th>
|
||||
<td class="col-md-7" >{{tenderData.tenderFee}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Fee Payable To</th>
|
||||
<td>{{tenderData.feePayableTo}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Fee Exemption Allowed</th>
|
||||
<td>{{tenderData.tenderFeeExemption}}</td>
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Fee Payable At</th>
|
||||
<td>{{tenderData.feePayableAt}}</td>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
<!-- <tr>
|
||||
<th>Fee Payable At</th>
|
||||
<td>{{tenderData.feePayableAt}}</td>
|
||||
</tr> -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">EMD Fee Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th >EMD Amount in ₹</th>
|
||||
<td class="col-md-6" >{{tenderData.emdAmt}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD Fee Type</th>
|
||||
<<<<<<< HEAD
|
||||
<td>{{tenderData?.emdFeeTypeD?.emdFeeType}}</td>
|
||||
=======
|
||||
<td>{{tenderData.emdFeeType}}</td>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD Payable To</th>
|
||||
<td>{{tenderData.emdPayableTo}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD through BG/ST or EMD Exemption Allowed</th>
|
||||
<td>{{tenderData.allowEmdBgOrSt}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD Percentage</th>
|
||||
<td>{{tenderData.emdPercentage}}</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Critical Dates</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th >Published Date</th>
|
||||
<td class="col-md-6" >{{tenderData.publishDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Document Download / Sale Start Date</th>
|
||||
<td>{{tenderData.saleStartDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Clarification Start Date</th>
|
||||
<td>{{tenderData.clarificationStartDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Submission Start Date</th>
|
||||
<td>{{tenderData.bidSubStartDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Opening Date</th>
|
||||
<td>{{tenderData.bidOpenDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Document Download / Sale End Date</th>
|
||||
<td>{{tenderData.saleEndDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pincode</th>
|
||||
<td>{{tenderData.pincode}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Clarification End Date</th>
|
||||
<td>{{tenderData.clarificationEndDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Submission End Date</th>
|
||||
<td>{{tenderData.bidSubEndDate}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Work Item Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Title</th>
|
||||
<td class="col-md-6">{{tenderData.title}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Work Description</th>
|
||||
<td>{{tenderData.workDesc}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Qualification</th>
|
||||
<td>{{tenderData.ndaPreQualification}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Independent External Monitor/Remarks</th>
|
||||
<td>{{tenderData.remarks}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Value in ₹</th>
|
||||
<td>{{tenderData.tenderValue}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Contract Type</th>
|
||||
<td>{{tenderData.contractType}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Location</th>
|
||||
<td>{{tenderData.location}}</td>
|
||||
</tr>
|
||||
<<<<<<< HEAD
|
||||
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Address</th>
|
||||
<td>{{tenderData.preBidMeetAdd}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Product Category</th>
|
||||
<td>{{tenderData?.productCategoryD?.productCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Validity(Days)</th>
|
||||
<td>{{tenderData.bidValidity}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Date</th>
|
||||
<td>{{tenderData.preBidDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Sub category</th>
|
||||
<td>{{tenderData.subCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Period Of Work(Days)</th>
|
||||
<td>{{tenderData.periodOfWork}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Place</th>
|
||||
<td>{{tenderData.preBidMeetPlace}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Opening Place</th>
|
||||
<td>{{tenderData.bidOpeningPlace}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
=======
|
||||
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Address</th>
|
||||
<td>{{tenderData.preBidMeetAdd}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Product Category</th>
|
||||
<td>{{tenderData.productCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Validity(Days)</th>
|
||||
<td>{{tenderData.bidValidity}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Date</th>
|
||||
<td>{{tenderData.preBidMeetAdd}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Sub category</th>
|
||||
<td>{{tenderData.subCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Period Of Work(Days)</th>
|
||||
<td>{{tenderData.periodOfWork}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Place</th>
|
||||
<td>{{tenderData.preBidMeetPlace}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Opening Place</th>
|
||||
<td>{{tenderData.bidOpeningPlace}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
<div class="col-md-12">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="12">Tenders Documents</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<<<<<<< HEAD
|
||||
<th colspan="12" class="text-center" style="background-color: #b8b8b8;" >Drawings Document</th>
|
||||
=======
|
||||
<th colspan="12" class="text-center" style="background-color: #b8b8b8;" >NIT Document</th>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<<<<<<< HEAD
|
||||
<th colspan="12">Drawings <button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="DownloadDrawings()"> <i class="bi bi-file-earmark-zip"></i> Download</button></th>
|
||||
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="12"></td>
|
||||
</tr>
|
||||
|
||||
|
||||
=======
|
||||
<th colspan="5">Document Name</th>
|
||||
<th colspan="7">Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="5"></td>
|
||||
<td colspan="7"></td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<th colspan="12"><span id="zipFile"> <i class="bi bi-file-earmark-zip"></i> Download</span> </th>
|
||||
</tr>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tbody>
|
||||
<br>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<th colspan="12" class="text-center" style="background-color:#b8b8b8;" >Work Item Documents</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Document Type</th>
|
||||
<th colspan="4">Document Name</th>
|
||||
<th colspan="4">Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<<<<<<< HEAD
|
||||
<th colspan="12"><button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="downloadZip()"> <i class="bi bi-file-earmark-zip" ></i> Download as Zip File</button> </th>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
<br>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th colspan="12" class="text-center" style="background-color:#b8b8b8;" >NIT Documents</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Document Type</th>
|
||||
<th colspan="4">Document Name</th>
|
||||
<th colspan="4">Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<th colspan="12"><button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="downloadZip()"> <i class="bi bi-file-earmark-zip" ></i> Download as Zip File</button> </th>
|
||||
=======
|
||||
<th colspan="12"><span id="zipFile"> <i class="bi bi-file-earmark-zip"></i> Download as Zip File</span> </th>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<<<<<<< HEAD
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="12">Required Documents Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th colspan="4">Document Type</th>
|
||||
<th colspan="4">Description</th>
|
||||
<th colspan="4">Document Format</th>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<th colspan="12"><button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="downloadZip()"> <i class="bi bi-file-earmark-zip" ></i> Download as Zip File</button> </th>
|
||||
|
||||
</tr>
|
||||
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Tender Inviting</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<td class="col-md-6" >{{tenderData.tenderInvName}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Address</th>
|
||||
<td>{{tenderData.tenderInvAddess}}</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
|
||||
</div><br>
|
||||
</div>
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;"
|
||||
class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023.
|
||||
</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>
|
||||
</footer>
|
||||
@ -0,0 +1,51 @@
|
||||
.container-fluid{
|
||||
width: 100%;
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
top: 10px;
|
||||
position: relative;
|
||||
}
|
||||
.container-fluid2{
|
||||
width: 100%;
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
top: -1px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.table td {
|
||||
word-break: break-word;
|
||||
}
|
||||
.nav-link:hover {
|
||||
color: rgb(255, 0, 0);
|
||||
}
|
||||
#zipFile:hover {
|
||||
color: rgb(255, 0, 0);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
// .container-responsive {
|
||||
// min-height: 100vh;
|
||||
// position: relative;
|
||||
// }
|
||||
|
||||
// #footer {
|
||||
// background-color: #3a8379;
|
||||
// padding: 20px;
|
||||
// color: #ffffff;
|
||||
// position: absolute;
|
||||
// bottom: 0;
|
||||
// width: 100%;
|
||||
// }
|
||||
|
||||
thead{
|
||||
<<<<<<< HEAD
|
||||
background-color:#48746e; color: aliceblue;
|
||||
=======
|
||||
background-color: rgb(161, 42, 42); color: aliceblue;
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { ViewComponent } from './view.component';
|
||||
|
||||
describe('ViewComponent', () => {
|
||||
let component: ViewComponent;
|
||||
let fixture: ComponentFixture<ViewComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ ViewComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(ViewComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,114 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
<<<<<<< HEAD
|
||||
import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto';
|
||||
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
|
||||
import { MasterService } from 'src/app/_providers/_services/master.service';
|
||||
import { environment } from 'src/environments/environment';
|
||||
=======
|
||||
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
|
||||
import { MasterService } from 'src/app/_providers/_services/master.service';
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
@Component({
|
||||
selector: 'app-view',
|
||||
templateUrl: './view.component.html',
|
||||
styleUrls: ['./view.component.scss']
|
||||
})
|
||||
export class ViewComponent implements OnInit {
|
||||
|
||||
tenderId: number;
|
||||
tenderData: any;
|
||||
|
||||
|
||||
constructor(private router: Router,
|
||||
private route: ActivatedRoute,
|
||||
private _masterService: MasterService) {
|
||||
this.tenderId = +this.route.snapshot.paramMap.get('id');
|
||||
}
|
||||
ngOnInit(): void {
|
||||
<<<<<<< HEAD
|
||||
this.tenderData = new TenderDetailDto()
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
console.log("this.tenderId",this.tenderId);
|
||||
this.getData()
|
||||
}
|
||||
|
||||
|
||||
getData(){
|
||||
this._masterService.getMasterDatabyId(apiUrl.AllTenderData,this.tenderId).then((res) =>{
|
||||
console.log("tenderData",res);
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
console.log("res",res.orgChain);
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
this.tenderData = res})
|
||||
}
|
||||
|
||||
|
||||
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
|
||||
goToHome(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
DownloadDrawings(){
|
||||
const id = this.tenderId;
|
||||
this._masterService.getMasterDatabyId(apiUrl.drawingsDownloadDocs,id).then((res)=>{
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
downloadZip() {
|
||||
console.log('clicked');
|
||||
const id = this.tenderId;
|
||||
// let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
// setTimeout(() => {
|
||||
// newWindow.close();
|
||||
// }, 10);
|
||||
|
||||
this._masterService.getMasterDatabyId(apiUrl.bankDocs, id).then(res => {
|
||||
|
||||
}, err => {
|
||||
console.log('res===>', err);
|
||||
if (err.status == 200) {
|
||||
console.log('start >>>');
|
||||
// window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
setTimeout(() => {
|
||||
newWindow.close();
|
||||
}, 100);
|
||||
}
|
||||
if (err.status == 404) {
|
||||
alert('No Bank Document Found for the selected Tender.');
|
||||
}
|
||||
if (err.status == 500) {
|
||||
alert(`${err.message}`);
|
||||
}
|
||||
else {
|
||||
alert(`An error Occured`);
|
||||
// let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
// setTimeout(() => {
|
||||
// newWindow.close();
|
||||
// }, 100);
|
||||
}
|
||||
|
||||
})
|
||||
// window.open('http://192.168.1.112:3500/api/v1/file-upload/Bank-Documents-Arc/'+id);
|
||||
|
||||
}
|
||||
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,49 @@
|
||||
// .container-responsive {
|
||||
// min-height: 100vh;
|
||||
// position: relative;
|
||||
// }
|
||||
|
||||
// #footer {
|
||||
// background-color: #3a8379;
|
||||
// padding: 20px;
|
||||
// color: #ffffff;
|
||||
// position: absolute;
|
||||
// bottom: 0;
|
||||
// width: 100%;
|
||||
// }
|
||||
.nav-link:hover {
|
||||
color: rgb(255, 0, 0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
::ng-deep .custom-tab-group .mat-tab-label {
|
||||
color: rgb(0, 0, 0);
|
||||
text-transform: none;
|
||||
min-width: 120px; /* adjust the value as per your requirements */
|
||||
|
||||
}
|
||||
<<<<<<< HEAD
|
||||
|
||||
.green-snackbar {
|
||||
background-color: green;
|
||||
color: white;
|
||||
}
|
||||
|
||||
|
||||
::ng-deep .mat-slide-toggle.mat-checked .mat-slide-toggle-bar {
|
||||
background-color: #16e2e2; /* Primary color */
|
||||
//cursor: pointer;
|
||||
}
|
||||
|
||||
::ng-deep .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb {
|
||||
background-color: #04fcfc; /* Accent color */
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.element-with-tooltip {
|
||||
cursor: pointer; /* Set the cursor style to pointer for the element */
|
||||
}
|
||||
=======
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { AddTendersComponent } from './add-tenders.component';
|
||||
|
||||
describe('AddTendersComponent', () => {
|
||||
let component: AddTendersComponent;
|
||||
let fixture: ComponentFixture<AddTendersComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ AddTendersComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AddTendersComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,793 @@
|
||||
import { Component, OnInit,ViewChild } from '@angular/core';
|
||||
<<<<<<< HEAD
|
||||
import { MatSnackBar,MatSnackBarConfig } from '@angular/material/snack-bar';
|
||||
import { MatTabGroup } from '@angular/material/tabs';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { TenderCoversDto } from 'src/app/_dto/tender-covers.dto';
|
||||
=======
|
||||
import { MatTabGroup } from '@angular/material/tabs';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto';
|
||||
import { TenderDocumentDto } from 'src/app/_dto/tender-documents.dto';
|
||||
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
|
||||
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
|
||||
import { MasterService } from 'src/app/_providers/_services/master.service';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
<<<<<<< HEAD
|
||||
import Swal from 'sweetalert2'
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
@Component({
|
||||
selector: 'app-add-tenders',
|
||||
templateUrl: './add-tenders.component.html',
|
||||
styleUrls: ['./add-tenders.component.scss']
|
||||
})
|
||||
export class AddTendersComponent implements OnInit {
|
||||
|
||||
@ViewChild(MatTabGroup) tabGroup: MatTabGroup;
|
||||
|
||||
tenderData: TenderDetailDto
|
||||
tenderTypeLov: any;
|
||||
TenderCategoryLov: any;
|
||||
PaymentModeLov: any;
|
||||
formcontractLov: any;
|
||||
productcategoryLov: any;
|
||||
AllTenderData: TenderDetailDto;
|
||||
emdFeeTypeLov: any;
|
||||
seculevel: any;
|
||||
documentTypeLov: any;
|
||||
isNITDocUploaded: boolean = false;
|
||||
isWIDocUploaded: boolean = false;
|
||||
<<<<<<< HEAD
|
||||
toggleValue : boolean = true;
|
||||
|
||||
nitDocuments: TenderDocumentDto[] ;
|
||||
workItemDocuments: TenderDocumentDto[];
|
||||
drawingsDocuments: TenderDocumentDto[];
|
||||
coverDocs : TenderCoversDto[];
|
||||
selectedFiles: any;
|
||||
tenderID: number;
|
||||
filteredDocumentTypeLov: any;
|
||||
filteredDocumentDrawingTypeLov: any;
|
||||
filteredDocumentNITTypeLov: any;
|
||||
coverslov: any;
|
||||
fileformatlov: any;
|
||||
addnoticeROW: boolean = true
|
||||
addDrwROW: boolean= true
|
||||
|
||||
showMessage: boolean = false;
|
||||
=======
|
||||
|
||||
nitDocuments: TenderDocumentDto[] ;
|
||||
workItemDocuments: TenderDocumentDto[];
|
||||
selectedFiles: any;
|
||||
tenderID: number;
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
constructor(private router: Router,
|
||||
private _masterService : MasterService,
|
||||
private _ui:UiService,
|
||||
private route: ActivatedRoute,
|
||||
<<<<<<< HEAD
|
||||
private errorTranslateService: ErrorTranslateService,
|
||||
private snackBar: MatSnackBar)
|
||||
=======
|
||||
private errorTranslateService: ErrorTranslateService,)
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
{
|
||||
|
||||
this.seculevel = localStorage.getItem('seculevel')
|
||||
this.tenderData = new TenderDetailDto();
|
||||
this.tenderID = +this.route.snapshot.paramMap.get('id');
|
||||
this.getData()
|
||||
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
<<<<<<< HEAD
|
||||
// this.addnoticeROW= true;
|
||||
// this.addDrwROW = true;
|
||||
this.nitDocuments = [];
|
||||
this.workItemDocuments = [];
|
||||
this.drawingsDocuments = [];
|
||||
this.coverDocs = [];
|
||||
|
||||
if(this.tenderID){
|
||||
|
||||
this._masterService.getMasterDatabyId(apiUrl.AllTenderData,this.tenderID).then((res) =>{
|
||||
this.tenderData = res
|
||||
|
||||
this.drawingsDocuments = this.tenderData.tenderDoc.filter(element=> element.documentCategory == 'D');
|
||||
for(let i=0;i<this.drawingsDocuments.length;i++){
|
||||
this.drawingsDocuments[i].file = this.drawingsDocuments[i].docName;
|
||||
console.log("this.drawingsDocuments===",this.drawingsDocuments);
|
||||
}
|
||||
|
||||
|
||||
this.nitDocuments = this.tenderData.tenderDoc.filter(element=> element.documentCategory == 'NIT');
|
||||
for(let i=0;i<this.nitDocuments.length;i++){
|
||||
this.nitDocuments[i].file = this.nitDocuments[i].docName;
|
||||
console.log("this.nitDocuments===",this.nitDocuments);
|
||||
}
|
||||
|
||||
|
||||
|
||||
this.workItemDocuments = this.tenderData.tenderDoc.filter(element=> element.documentCategory == 'WID');
|
||||
for(let i=0;i<this.workItemDocuments.length;i++){
|
||||
this.workItemDocuments[i].file = this.workItemDocuments[i].docName;
|
||||
console.log("this.workItemDocuments===",this.workItemDocuments);
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
addNoticeToggle(event){
|
||||
this.addnoticeROW = !event.checked;
|
||||
|
||||
}
|
||||
|
||||
addDrawingToggle(event){
|
||||
this.addDrwROW = !event.checked;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
=======
|
||||
this.nitDocuments = [];
|
||||
this.workItemDocuments = [];
|
||||
|
||||
|
||||
|
||||
if(this.tenderID)
|
||||
this._masterService.getMasterDatabyId(apiUrl.AllTenderData,this.tenderID).then((res) =>{
|
||||
console.log("gfgfgf",res);
|
||||
this.tenderData = res
|
||||
this.nitDocuments = this.tenderData.tenderDoc.filter(element=> element.documentCategory == 'NIT');
|
||||
this.workItemDocuments = this.tenderData.tenderDoc.filter(element=> element.documentCategory == 'WID');
|
||||
})
|
||||
|
||||
}
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
getData(){
|
||||
// this._masterService.getMasterData(apiUrl).then((res) =>{
|
||||
// this.AllTenderData = res
|
||||
// console.log("res",res);
|
||||
// })
|
||||
|
||||
this._masterService.getMasterData(apiUrl.TenderType).then((res) =>{
|
||||
this.tenderTypeLov = res
|
||||
|
||||
})
|
||||
this._masterService.getMasterData(apiUrl.emdFeeType).then((res) =>{
|
||||
this.emdFeeTypeLov = res
|
||||
console.log("emdFeeTypeLov",this.emdFeeTypeLov);
|
||||
|
||||
})
|
||||
|
||||
|
||||
this._masterService.getMasterData(apiUrl.documentType).then((res) =>{
|
||||
this.documentTypeLov = res
|
||||
console.log("res========================",res);
|
||||
<<<<<<< HEAD
|
||||
this.filteredDocumentDrawingTypeLov = this.documentTypeLov.filter(docType => docType.docCategory === 'D');
|
||||
this.filteredDocumentNITTypeLov = this.documentTypeLov.filter(docType => docType.docCategory === 'N');
|
||||
|
||||
this.filteredDocumentTypeLov = this.documentTypeLov.filter(docType => docType.docCategory == 'WID');
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
})
|
||||
|
||||
this._masterService.getMasterData(apiUrl.TenderCategory).then((res) =>{
|
||||
this.TenderCategoryLov = res
|
||||
// console.log("TenderCategoryLov",res);
|
||||
})
|
||||
this._masterService.getMasterData(apiUrl.PaymentMode).then((res) =>{
|
||||
this.PaymentModeLov = res
|
||||
// console.log("PaymentModeLov",res);
|
||||
})
|
||||
|
||||
this._masterService.getMasterData(apiUrl.formcontract).then((res) =>{
|
||||
this.formcontractLov = res
|
||||
// console.log("formcontractLov",res);
|
||||
})
|
||||
this._masterService.getMasterData(apiUrl.productcategory).then((res) =>{
|
||||
this.productcategoryLov = res
|
||||
// console.log("productcategoryLov",res);
|
||||
})
|
||||
|
||||
<<<<<<< HEAD
|
||||
this._masterService.getMasterData(apiUrl.coverslov).then((res) =>{
|
||||
this.coverslov = res
|
||||
|
||||
})
|
||||
this._masterService.getMasterData(apiUrl.fileformatlov).then((res) =>{
|
||||
this.fileformatlov = res
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
addNewNitDocRow() {
|
||||
if(this.addnoticeROW){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("pleaseEnableNoticeDocuments"),2000,false);
|
||||
|
||||
}else {
|
||||
=======
|
||||
}
|
||||
|
||||
addNewNITDocRow() {
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
const lastRow = new TenderDocumentDto();
|
||||
let newRow = Object.assign({}, lastRow);
|
||||
newRow.documentCategory = 'NIT'
|
||||
newRow.crud = 'I'
|
||||
this.nitDocuments.push(newRow);
|
||||
console.log('===this.nitDocuments===',this.nitDocuments);
|
||||
<<<<<<< HEAD
|
||||
}
|
||||
}
|
||||
|
||||
addNewDrawingRow() {
|
||||
if(this.addDrwROW){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("pleaseEnableDrawingDocuments"),2000,false);
|
||||
|
||||
}else {
|
||||
const lastRow = new TenderDocumentDto();
|
||||
let newRow = Object.assign({}, lastRow);
|
||||
newRow.documentCategory = 'D'
|
||||
newRow.crud = 'I'
|
||||
this.drawingsDocuments.push(newRow);
|
||||
console.log('===this.drawingsDocuments===',this.drawingsDocuments);
|
||||
|
||||
}
|
||||
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
}
|
||||
|
||||
addNewWorkItemDocRow() {
|
||||
|
||||
// const lastRow = this.tenderData.tenderDocs[this.tenderData.tenderDocs.length - 1];
|
||||
const lastRow = new TenderDocumentDto();
|
||||
const newRow = Object.assign({}, lastRow);
|
||||
newRow.documentCategory = 'WID'
|
||||
newRow.crud = 'I'
|
||||
this.workItemDocuments.push(newRow);
|
||||
}
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
addNewcoverDocRow() {
|
||||
|
||||
const lastRow = new TenderCoversDto();
|
||||
const newRow = Object.assign({}, lastRow);
|
||||
// newRow.documentCategory = 'C'
|
||||
newRow.crud = 'I'
|
||||
this.coverDocs.push(newRow);
|
||||
}
|
||||
|
||||
|
||||
deleteDrawingsRow(id, index: number) {
|
||||
|
||||
|
||||
let removeRow = Object.assign({}, (this.drawingsDocuments).splice(index, 1)[0]);
|
||||
// this.nitDocuments.push(removeRow);
|
||||
|
||||
}
|
||||
deleteNITRow(id, index: number) {
|
||||
|
||||
let removeRow = Object.assign({}, (this.nitDocuments).splice(index, 1)[0]);
|
||||
// this.workItemDocuments.push(removeRow);
|
||||
|
||||
}
|
||||
deleteWIDRow(id, index: number) {
|
||||
|
||||
=======
|
||||
deleteNITRow(id, index: number) {
|
||||
|
||||
// console.log('id for delete===', id);
|
||||
console.log('index for delete===', index);
|
||||
|
||||
let removeRow = Object.assign({}, (this.nitDocuments).splice(index, 1)[0]);
|
||||
// this.nitDocuments.push(removeRow);
|
||||
|
||||
}
|
||||
deleteWIDRow(id, index: number) {
|
||||
|
||||
console.log('id for delete===', id);
|
||||
console.log('index for delete===', index);
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
let removeRow = Object.assign({}, (this.workItemDocuments).splice(index, 1)[0]);
|
||||
// this.workItemDocuments.push(removeRow);
|
||||
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
deleteCoverRow(id, index: number){
|
||||
|
||||
let removeRow = Object.assign({}, (this.coverDocs).splice(index, 1)[0]);
|
||||
|
||||
}
|
||||
|
||||
UploadFiles(event,i,type){
|
||||
=======
|
||||
UploadFiles(event,i,type){
|
||||
console.log(" this.tenderData.tenderId", this.tenderData.tenderId);
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
this.selectedFiles = event.target.files;
|
||||
let file = event.target.files[0]
|
||||
const fd = new FormData();
|
||||
fd.append('file', file);
|
||||
|
||||
|
||||
if(file && this.tenderData.tenderId)
|
||||
this._masterService.postMasterData(apiUrl.docUpload,fd,this.tenderData.tenderId).then((res)=>{
|
||||
console.log("res1===",res.fileName);
|
||||
console.log("res2===",res.fileSizeKB);
|
||||
console.log('======= this.tenderData.tenderDocs==========', this.tenderData.tenderDoc);
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
if(type == 'WID'){
|
||||
// this.nitDocuments[i].docName = res.fileName
|
||||
// this.nitDocuments[i].file = res.fileName
|
||||
// this.nitDocuments[i].documentSize =res.fileSizeKB;
|
||||
// }
|
||||
// else{
|
||||
|
||||
this.workItemDocuments[i].docName = res.fileName
|
||||
this.workItemDocuments[i].file = res.fileName
|
||||
this.workItemDocuments[i].documentSize =res.fileSizeKB;
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
UploadNoticeFiles(event,i,type){
|
||||
this.selectedFiles = event.target.files;
|
||||
let file = event.target.files[0]
|
||||
const fd = new FormData();
|
||||
fd.append('file', file);
|
||||
|
||||
|
||||
if(file && this.tenderData.tenderId)
|
||||
this._masterService.postMasterData(apiUrl.nitUploadDoc,fd,this.tenderData.tenderId).then((res)=>{
|
||||
console.log("res1===",res.fileName);
|
||||
console.log("res2===",res.fileSizeKB);
|
||||
console.log('======= this.tenderData.tenderDocs==========', this.tenderData.tenderDoc);
|
||||
|
||||
|
||||
if(type == 'NIT'){
|
||||
this.nitDocuments[i].docName = res.fileName
|
||||
this.nitDocuments[i].file = res.fileName
|
||||
this.nitDocuments[i].documentSize =res.fileSizeKB;
|
||||
}
|
||||
// else{
|
||||
|
||||
// this.workItemDocuments[i].docName = res.fileName
|
||||
// this.workItemDocuments[i].file = res.fileName
|
||||
// this.workItemDocuments[i].documentSize =res.fileSizeKB;
|
||||
// }
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
UploadDrawingFiles(event,i){
|
||||
|
||||
|
||||
this.selectedFiles = event.target.files;
|
||||
let file = event.target.files[0]
|
||||
const fd = new FormData();
|
||||
fd.append('file', file);
|
||||
if(file && this.tenderData.tenderId)
|
||||
console.log(" this.drawingsDocuments", this.drawingsDocuments);
|
||||
this._masterService.postMasterData(apiUrl.drawingUploadDoc,fd,this.tenderData.tenderId).then((res) =>{
|
||||
console.log("drawings===",res);
|
||||
this.drawingsDocuments[i].docName = res.fileName
|
||||
this.drawingsDocuments[i].file = res.fileName;
|
||||
this.drawingsDocuments[i].documentSize =res.fileSizeKB;
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
// UploadCoverFiles(event,i){
|
||||
// this.selectedFiles = event.target.files;
|
||||
// let file = event.target.files[0]
|
||||
// const fd = new FormData();
|
||||
// fd.append('file', file);
|
||||
// if(file && this.tenderData.tenderId){
|
||||
// coverDocs
|
||||
// }
|
||||
|
||||
// }
|
||||
|
||||
=======
|
||||
if(type == 'NIT'){
|
||||
this.nitDocuments[i].docName = res.fileName
|
||||
this.nitDocuments[i].documentSize =res.fileSizeKB;
|
||||
}
|
||||
else{
|
||||
this.workItemDocuments[i].docName = res.fileName
|
||||
this.workItemDocuments[i].documentSize =res.fileSizeKB;
|
||||
}
|
||||
|
||||
// this.tenderData.tenderDocs[i].docName = res.fileName;
|
||||
// this.tenderData.tenderDocs[i].doc_size =res.fileSizeKB;
|
||||
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
readUrl(event: any) {
|
||||
// console.log('size is high');
|
||||
// if (event.target.files && event.target.files[0]) {
|
||||
|
||||
// if (event.target.files[0].type === 'image/jpeg' ||
|
||||
// event.target.files[0].type === 'image/png' ||
|
||||
// event.target.files[0].type === 'image/jpg') {
|
||||
// if (event.target.files[0].size < 200 * 200) {/* Checking height * width*/ }
|
||||
// if (event.target.files[0].size < 1000000) {
|
||||
|
||||
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
|
||||
goToHome(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
|
||||
BasicDetails(){
|
||||
if(this.tenderData.orgChain =='' || this.tenderData.orgChain == null || this.tenderData.orgChain == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("organisationNameCantBeBlank"),2000,true);
|
||||
console.log("errrrr");
|
||||
}
|
||||
else if(this.tenderData.tenderRefNo =='' || this.tenderData.tenderRefNo == null || this.tenderData.tenderRefNo == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderReferenceNumberCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.tenderId =='' || this.tenderData.tenderId == null || this.tenderData.tenderId == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderIDCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.tenderType == null || this.tenderData.tenderType == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderTypeCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.tenderCategory == null || this.tenderData.tenderCategory == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderCategoryCantBeBlank"),2000,true);
|
||||
|
||||
}
|
||||
else if( this.tenderData.paymentMode == null || this.tenderData.paymentMode == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("paymentModeCantBeBlank"),2000,true);
|
||||
|
||||
}
|
||||
else if( this.tenderData.formOfContract == null || this.tenderData.formOfContract == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("formOfContractCantBeBlank"),2000,true);
|
||||
|
||||
}
|
||||
// else if( this.tenderData.noOfCovers == null || this.tenderData.noOfCovers == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("noOfCoversCantBeBlank"),2000,true);
|
||||
|
||||
// }
|
||||
else this.nextTab()
|
||||
|
||||
}
|
||||
|
||||
TenderFeeDetails(){
|
||||
if( this.tenderData.tenderFee == null || this.tenderData.tenderFee == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderFeeInCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if(this.tenderData.feePayableTo =='' || this.tenderData.feePayableTo == null || this.tenderData.feePayableTo == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("feePayableToCantBeBlank"),2000,true);
|
||||
// }
|
||||
else if( this.tenderData.tenderFeeExemption == null || this.tenderData.tenderFeeExemption == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderFeeExemptionAllowedCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if(this.tenderData.feePayableAt =='' || this.tenderData.feePayableAt == null || this.tenderData.feePayableAt == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("feePayableAtCantBeBlank"),2000,true);
|
||||
// }
|
||||
else this.nextTab()
|
||||
|
||||
}
|
||||
|
||||
|
||||
EMDFeeDetails(){
|
||||
if( this.tenderData.emdAmt == null || this.tenderData.emdAmt == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("emdAmountCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.emdFeeType =='' || this.tenderData.emdFeeType == null || this.tenderData.emdFeeType == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("emdFeeTypeCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if(this.tenderData.emdPayableTo =='' || this.tenderData.emdPayableTo == null || this.tenderData.emdPayableTo == undefined){
|
||||
// console.log("this.tenderData.emdPayableTo",this.tenderData.emdPayableTo);
|
||||
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("emdPayableToCantBeBlank"),2000,true);
|
||||
// }
|
||||
else if( this.tenderData.allowEmdBgOrSt == '' || this.tenderData.allowEmdBgOrSt == null || this.tenderData.allowEmdBgOrSt == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("selectEmdThrough"),2000,true);
|
||||
}
|
||||
// else if( this.tenderData.emdPercentage == null || this.tenderData.emdPercentage == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("emdPercentageCantBeBlank"),2000,true);
|
||||
// }
|
||||
|
||||
else this.nextTab()
|
||||
|
||||
}
|
||||
|
||||
|
||||
WorkItemDetails(){
|
||||
if( this.tenderData.title == '' || this.tenderData.title == null || this.tenderData.title == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("titleCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.workDesc =='' || this.tenderData.workDesc == null || this.tenderData.workDesc == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("workDescriptionCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.ndaPreQualification =='' || this.tenderData.ndaPreQualification == null || this.tenderData.ndaPreQualification == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("preQualificationCantBeBlank"),2000,true);
|
||||
}
|
||||
<<<<<<< HEAD
|
||||
else if( this.tenderData.tenderValue == null || this.tenderData.tenderValue == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderValueCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.productCategory == null || this.tenderData.productCategory == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("productCategoryCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.subCategory =='' || this.tenderData.subCategory == null || this.tenderData.subCategory == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("subCategoryCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.bidValidity == null || this.tenderData.bidValidity == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("bidValidityCantBeBlank"),2000,true);
|
||||
}
|
||||
|
||||
else if( this.tenderData.periodOfWork == null || this.tenderData.periodOfWork == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("periodOfWorkCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.location =='' || this.tenderData.location == null || this.tenderData.location == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("locationCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.pincode == null || this.tenderData.pincode == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("pincodeCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.bidOpeningPlace =='' || this.tenderData.bidOpeningPlace == null || this.tenderData.bidOpeningPlace == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("bidOpeningPlaceCantBeBlank"),2000,true);
|
||||
}
|
||||
|
||||
// else if(this.tenderData.contractType =='' || this.tenderData.contractType == null || this.tenderData.contractType == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("contractTypeCantBeBlank"),2000,true);
|
||||
// }
|
||||
|
||||
// else if( this.tenderData.preBidMeetAdd == '' || this.tenderData.preBidMeetAdd == null || this.tenderData.preBidMeetAdd == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("preBidMeetingAddressCantBeBlank"),2000,true);
|
||||
// }
|
||||
|
||||
|
||||
// else if( this.tenderData.preBidDate == null || this.tenderData.preBidDate == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("preBidMeetingDateCantBeBlank"),2000,true);
|
||||
// }
|
||||
|
||||
// else if(this.tenderData.preBidMeetPlace == '' || this.tenderData.preBidMeetPlace == null || this.tenderData.preBidMeetPlace == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("preBidMeetingPlaceCantBeBlank"),2000,true);
|
||||
// }
|
||||
|
||||
=======
|
||||
else if( this.tenderData.pincode == null || this.tenderData.pincode == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("pincodeCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.tenderValue == null || this.tenderData.tenderValue == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("tenderValueCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.contractType =='' || this.tenderData.contractType == null || this.tenderData.contractType == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("contractTypeCantBeBlank"),2000,true);
|
||||
}
|
||||
else if(this.tenderData.location =='' || this.tenderData.location == null || this.tenderData.location == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("locationCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if( this.tenderData.preBidMeetAdd == '' || this.tenderData.preBidMeetAdd == null || this.tenderData.preBidMeetAdd == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("preBidMeetingAddressCantBeBlank"),2000,true);
|
||||
// }
|
||||
else if( this.tenderData.productCategory == null || this.tenderData.productCategory == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("productCategoryCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.bidValidity == null || this.tenderData.bidValidity == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("bidValidityCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if( this.tenderData.preBidDate == null || this.tenderData.preBidDate == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("preBidMeetingDateCantBeBlank"),2000,true);
|
||||
// }
|
||||
else if(this.tenderData.subCategory =='' || this.tenderData.subCategory == null || this.tenderData.subCategory == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("subCategoryCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.periodOfWork == null || this.tenderData.periodOfWork == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("periodOfWorkCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if(this.tenderData.preBidMeetPlace == '' || this.tenderData.preBidMeetPlace == null || this.tenderData.preBidMeetPlace == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("preBidMeetingPlaceCantBeBlank"),2000,true);
|
||||
// }
|
||||
else if(this.tenderData.bidOpeningPlace =='' || this.tenderData.bidOpeningPlace == null || this.tenderData.bidOpeningPlace == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("bidOpeningPlaceCantBeBlank"),2000,true);
|
||||
}
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
else this.nextTab()
|
||||
|
||||
}
|
||||
|
||||
CriticalDates(){
|
||||
|
||||
if( this.tenderData.publishDate == null || this.tenderData.publishDate == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("publishedDateCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.saleStartDate == null || this.tenderData.saleStartDate == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("documentDownloadSaleStartCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if( this.tenderData.clarificationStartDate == null || this.tenderData.clarificationStartDate == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("clarificationStartDateCantBeBlank"),2000,true);
|
||||
// }
|
||||
else if( this.tenderData.saleEndDate == null || this.tenderData.saleEndDate == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("documentDownloadSaleEndCantBeBlank"),2000,true);
|
||||
}
|
||||
// else if( this.tenderData.clarificationEndDate == null || this.tenderData.clarificationEndDate == undefined){
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("clarificationEndDateCantBeBlank"),2000,true);
|
||||
// }
|
||||
else if( this.tenderData.bidSubStartDate == null || this.tenderData.bidSubStartDate == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("bidSubmissionStartDateCantBeBlank"),2000,true);
|
||||
}
|
||||
|
||||
else if( this.tenderData.bidSubEndDate == null || this.tenderData.bidSubEndDate == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("bidSubmissionEndDateCantBeBlank"),2000,true);
|
||||
}
|
||||
else if( this.tenderData.bidOpenDate == null || this.tenderData.bidOpenDate == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("bidOpeningDateCantBeBlank"),2000,true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
else this.nextTab()
|
||||
|
||||
}
|
||||
|
||||
TendersDocuments(){
|
||||
<<<<<<< HEAD
|
||||
// if( this.nitDocuments.file == null || this.nitDocuments.file == undefined){
|
||||
=======
|
||||
// if( this.tenderData.emdAmt == null || this.tenderData.emdAmt == undefined){
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
// this._ui.toastMessage(this.errorTranslateService.translate("feePayableAtCantBeBlank"),2000,true);
|
||||
// }
|
||||
// else if(this.tenderData.emdFeeType =='' || this.tenderData.emdFeeType == null || this.tenderData.emdFeeType == undefined){
|
||||
// console.log("errrrr2");
|
||||
// }
|
||||
// else if(this.tenderData.emdPayableTo =='' || this.tenderData.emdPayableTo == null || this.tenderData.emdPayableTo == undefined){
|
||||
// console.log("errrrr3");
|
||||
// }
|
||||
// else if( this.tenderData.allowEmdBgOrSt == '' || this.tenderData.allowEmdBgOrSt == null || this.tenderData.allowEmdBgOrSt == undefined){
|
||||
// console.log("errrrr4");
|
||||
// }
|
||||
// else if( this.tenderData.emdPercentage == null || this.tenderData.emdPercentage == undefined){
|
||||
// console.log("errrrr5");
|
||||
// }
|
||||
// else
|
||||
<<<<<<< HEAD
|
||||
this.tenderData.tenderDoc = this.nitDocuments.concat(this.workItemDocuments, this.drawingsDocuments)
|
||||
this.nextTab()
|
||||
}
|
||||
|
||||
RequiredDocuments(){
|
||||
|
||||
|
||||
this.tenderData.covers = this.coverDocs
|
||||
this.nextTab()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
=======
|
||||
this.tenderData.tenderDoc = this.nitDocuments.concat(this.workItemDocuments)
|
||||
this.nextTab()
|
||||
}
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
submit(){
|
||||
this.tenderData.crud = 'I'
|
||||
console.log('onsub---',this.tenderData);
|
||||
|
||||
if( this.tenderData.tenderInvName == '' || this.tenderData.tenderInvName == null || this.tenderData.tenderInvName == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("nameCantBeBlank"),2000,true);
|
||||
return
|
||||
}
|
||||
if(this.tenderData.tenderInvAddess == '' || this.tenderData.tenderInvAddess == null || this.tenderData.tenderInvAddess == undefined){
|
||||
this._ui.toastMessage(this.errorTranslateService.translate("addressCantBeBlank"),2000,true);
|
||||
return
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
this._masterService.saveAllMasterData(apiUrl.AllTenderData,this.tenderData).then((res)=>{
|
||||
console.log('successssssssss========',res);
|
||||
|
||||
if(res){
|
||||
Swal.fire(
|
||||
'Created',
|
||||
'Tender created successfully',
|
||||
'success'
|
||||
)
|
||||
}
|
||||
|
||||
}, (err) =>{
|
||||
if(err.status != 201){
|
||||
console.log("-error-");
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Oops...',
|
||||
text: 'Something went wrong!',
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
});
|
||||
=======
|
||||
console.log('onsub-2--',this.tenderData);
|
||||
|
||||
//
|
||||
|
||||
this._masterService.saveAllMasterData(apiUrl.AllTenderData,this.tenderData).then((res)=>{
|
||||
console.log(res);
|
||||
|
||||
})
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
display(){
|
||||
console.log('ddddaaatttaa===',this.tenderData);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { DashboardComponent } from './dashboard.component';
|
||||
import { LayoutComponentComponent } from './layout-component/layout-component.component';
|
||||
import { HomeViewComponent } from './home-view/home-view.component';
|
||||
import { HomeUploadComponent } from './home-upload/home-upload.component';
|
||||
import { AddTendersComponent } from './add-tenders/add-tenders.component';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
path: '', component: LayoutComponentComponent, children: [
|
||||
{ path: '', redirectTo: '/dashboard', pathMatch: 'full' },
|
||||
{ path: 'dashboard', component: DashboardComponent },
|
||||
{path:'tender-view/:id', component:HomeViewComponent},
|
||||
<<<<<<< HEAD
|
||||
{path:'tender-upload/:id',component:HomeUploadComponent},
|
||||
=======
|
||||
{path:'tender-upload',component:HomeUploadComponent},
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
{ path: 'add-tenders', component: AddTendersComponent},
|
||||
{ path: 'add-tenders/:id', component: AddTendersComponent}
|
||||
|
||||
// { path: 'master', loadChildren: () => import('../master/master.module').then(m => m.MasterModule) },
|
||||
// { path: 'report', loadChildren: () => import('../report/report.module').then(m => m.ReportModule) },
|
||||
// { path: 'support', loadChildren: () => import('../support/support.module').then(m => m.SupportModule) },
|
||||
// { path: 'transaction', loadChildren: () => import('../transaction/transaction.module').then(m => m.TransactionModule) }
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forChild(routes)],
|
||||
exports: [RouterModule]
|
||||
})
|
||||
export class DashboardRoutingModule { }
|
||||
@ -0,0 +1,272 @@
|
||||
<div class="container-responsive">
|
||||
<<<<<<< HEAD
|
||||
<mat-progress-bar mode="indeterminate" *ngIf="loading"></mat-progress-bar>
|
||||
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToAddTenders()">Add Tenders</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToHome()">Home</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
|
||||
</li> -->
|
||||
<!-- <li class="nav-item">
|
||||
<p class="nav-link sign-out-link" (click)="signOut()">Sign In <i class="bi bi-person-plus-fill"></i></p>
|
||||
</li> -->
|
||||
<!-- <li class="nav-item">
|
||||
<p class="nav-link sign-out-link" (click)="signOut()">Sign Out <i class="bi bi-person-x-fill"></i></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
<nav class="navbar navbar-dark-responsive" style="background-image: url('assets/img/panel_background.jpg');padding: 50px;">
|
||||
</nav> -->
|
||||
|
||||
|
||||
|
||||
<!-- <mat-progress-bar mode="indeterminate" color="warn"></mat-progress-bar> -->
|
||||
<!-- <div style="text-align: right;margin: 10px 10px 0px 0px;">
|
||||
</div> -->
|
||||
<br>
|
||||
|
||||
<<<<<<< HEAD
|
||||
<div class="container ">
|
||||
=======
|
||||
<div class="container text-center">
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div style="text-align: right;margin-bottom: 5px;" *ngIf="seculevel == 'B'">
|
||||
<<<<<<< HEAD
|
||||
<button mat-raised-button (click)="addNewTender()" style="color: #46AC9E;">{{ 'addTender' | translate }}</button>
|
||||
=======
|
||||
<button mat-raised-button (click)="addNewTender()" style="color: darkred;">{{ 'addTender' | translate }}</button>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</div>
|
||||
<div class="card-responsive">
|
||||
<div class="card-body-responsive">
|
||||
<div class="table-responsive">
|
||||
<!-- <table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th class="col-sm-1">#</th>
|
||||
<th class="col-sm-8">TENDER NAME</th>
|
||||
<th class="col-sm-1" *ngIf="seculevel == 'B'">EDIT</th>
|
||||
<th class="col-sm-1">VIEW</th>
|
||||
<<<<<<< HEAD
|
||||
<th class="col-sm-1" *ngIf="seculevel != 'B'">UPLOAD</th>
|
||||
|
||||
=======
|
||||
<th class="col-sm-1">UPLOAD</th>
|
||||
<!-- <th class="col-sm-1">CANCEL</th> -->
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let tender of tenderData; let i = index">
|
||||
<td class="col-sm-1">{{ i + 1 }}</td>
|
||||
<td class="col-sm-6 table-break-word">{{ tender.title }}</td>
|
||||
<td class="col-sm-1" *ngIf="seculevel == 'B'">
|
||||
<button type="button" class="btn btn-outline-secondary btn-sm" (click)="goToEdit(tender.id)"><i class="bi bi-pencil-square"></i></button>
|
||||
</td>
|
||||
<td class="col-sm-1" >
|
||||
<button type="button" class="btn btn-outline-dark btn-sm" (click)="goToView(tender.id)"><i class="bi bi-card-list"></i></button>
|
||||
</td>
|
||||
<<<<<<< HEAD
|
||||
<td class="col-sm-1" *ngIf="seculevel != 'B'">
|
||||
<button type="button" class="btn btn-outline-dark btn-sm" (click)="goToUpload(tender.id)"><i class="bi bi-upload"></i></button>
|
||||
=======
|
||||
<td class="col-sm-1" >
|
||||
<button type="button" class="btn btn-outline-dark btn-sm" (click)="goToUpload()"><i class="bi bi-upload"></i></button>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table> -->
|
||||
<ng-container >
|
||||
<mat-card class="card">
|
||||
<div class="top-bar">
|
||||
<div class="top-left-float">
|
||||
<span>
|
||||
<mat-icon style="margin-right: 3px; transform: translateY(10px);">search</mat-icon>
|
||||
<mat-form-field>
|
||||
<input matInput placeholder="{{ 'search' | translate }}" style="width: fit-content;"
|
||||
[(ngModel)]="searchTerm" (keyup.enter)="search()"/>
|
||||
</mat-form-field>
|
||||
</span>
|
||||
<button mat-raised-button style="color: #46AC9E;" (click)="search()"> {{ 'go' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="top-right-float">
|
||||
<button mat-raised-button style="color: #46AC9E;" (click)="reset()"> {{ 'reset' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<mat-table [dataSource]="dataSource" style="min-width: 500px;display: table;" matSort matSortDisableClear="true" (matSortChange)="sortData($event)"
|
||||
class="table">
|
||||
|
||||
<ng-container matColumnDef="actions" class="table-column" >
|
||||
<th mat-header-cell *matHeaderCellDef style="padding: 5px;" style="width:60px" class="table-headers">
|
||||
<!-- {{ 'actions' | translate }} -->
|
||||
<!-- <mat-icon>sort</mat-icon> -->
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element;let i=index" style="padding: 5px;" class="table-content first-column">
|
||||
<button style="padding: 0;" mat-button color="primary"
|
||||
(click)="goToEdit(element.id)" [disabled]="false">
|
||||
<mat-icon style="transform: translateY(-10px);">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<path
|
||||
d="M490.3 40.4C512.2 62.27 512.2 97.73 490.3 119.6L460.3 149.7L362.3 51.72L392.4 21.66C414.3-.2135 449.7-.2135 471.6 21.66L490.3 40.4zM172.4 241.7L339.7 74.34L437.7 172.3L270.3 339.6C264.2 345.8 256.7 350.4 248.4 353.2L159.6 382.8C150.1 385.6 141.5 383.4 135 376.1C128.6 370.5 126.4 361 129.2 352.4L158.8 263.6C161.6 255.3 166.2 247.8 172.4 241.7V241.7zM192 63.1C209.7 63.1 224 78.33 224 95.1C224 113.7 209.7 127.1 192 127.1H96C78.33 127.1 64 142.3 64 159.1V416C64 433.7 78.33 448 96 448H352C369.7 448 384 433.7 384 416V319.1C384 302.3 398.3 287.1 416 287.1C433.7 287.1 448 302.3 448 319.1V416C448 469 405 512 352 512H96C42.98 512 0 469 0 416V159.1C0 106.1 42.98 63.1 96 63.1H192z"
|
||||
fill="#46AC9E"/>
|
||||
</svg>
|
||||
</mat-icon>
|
||||
</button>
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="slno">
|
||||
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
|
||||
{{ 'slno' | translate }}
|
||||
<!-- <mat-icon>sort</mat-icon> -->
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element;let i = index" style="padding: 5px;" class="table-content">
|
||||
{{i+1}}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="title">
|
||||
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
|
||||
{{ 'title' | translate }}
|
||||
<mat-icon>sort</mat-icon>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
{{element?.title}}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="publishedDate">
|
||||
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
|
||||
{{ 'publishedDate' | translate }}
|
||||
<mat-icon>sort</mat-icon>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
{{element?.publishDate| date:"YYYY-MM-dd"}}
|
||||
</td>
|
||||
<!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
<button mat-raised-button>edit</button>
|
||||
</td> -->
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="bidOpenDate">
|
||||
<th mat-header-cell mat-sort-header *matHeaderCellDef class="table-headers">
|
||||
{{ 'bidOpenDate' | translate }}
|
||||
<mat-icon>sort</mat-icon>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
{{element?.bidOpenDate| date:"YYYY-MM-dd"}}
|
||||
</td>
|
||||
<!-- <td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
<button mat-raised-button>edit</button>
|
||||
</td> -->
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="view">
|
||||
<th mat-header-cell *matHeaderCellDef class="table-headers" style="width:80px">
|
||||
{{ 'view' | translate }}
|
||||
<!-- <mat-icon>sort</mat-icon> -->
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let element" style="padding: 5px;" class="table-content">
|
||||
<button style="padding: 0;" mat-button color="primary"
|
||||
(click)="goToView(element.id)" [disabled]="false">
|
||||
<mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#46AC9E'}">
|
||||
insert_drive_file
|
||||
</mat-icon>
|
||||
</button>
|
||||
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<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 style="padding: 0;" mat-button color="primary"
|
||||
(click)="goToUpload(element.id)" [disabled]="false">
|
||||
<mat-icon style="transform: translate(-12px,-2px);" [ngStyle]="{'color':'#46AC9E'}">
|
||||
cloud_upload
|
||||
</mat-icon>
|
||||
</button>
|
||||
|
||||
</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 }}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<tr mat-header-row *matHeaderRowDef="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="['nodata']" [ngClass]="{'hide': (!noData || loading)}"></tr>
|
||||
|
||||
</mat-table>
|
||||
|
||||
<mat-paginator #paginator [length]="pageLength" [pageSize]="10" [pageSizeOptions]="[5, 10, 25, 100]"
|
||||
aria-label="Select page">
|
||||
</mat-paginator>
|
||||
</mat-card>
|
||||
</ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><br><br>
|
||||
<div class="footer" >
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;" class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023. </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>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
@ -0,0 +1,230 @@
|
||||
// .header {
|
||||
// margin-left: 4%;
|
||||
// margin-top: 20px;
|
||||
// }
|
||||
|
||||
// .header>h6{
|
||||
// a {
|
||||
// text-decoration: none;
|
||||
// color: #262627;
|
||||
// }
|
||||
|
||||
// a:hover {
|
||||
// text-decoration: underline;
|
||||
// cursor: pointer;
|
||||
// }
|
||||
// }
|
||||
|
||||
// mat-card{
|
||||
// min-width: 180px ;
|
||||
// // max-width: 20vw;
|
||||
// height: 200px;
|
||||
// display: inline-block;
|
||||
// }
|
||||
|
||||
// mat-card:hover{
|
||||
// cursor: pointer;
|
||||
// }
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
.nav-link:hover {
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
th,
|
||||
td {
|
||||
padding: 10px;
|
||||
// border: 1px solid #ccc;
|
||||
word-wrap: break-word;
|
||||
white-space: normal;
|
||||
|
||||
}
|
||||
|
||||
.h2 {
|
||||
font-family: sans-serif;
|
||||
font-size: 26px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
|
||||
.table td {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.table-break-word {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.top-bar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
border: 1px solid #e3e3e3;
|
||||
width: 100%;
|
||||
margin: auto;
|
||||
padding: auto;
|
||||
}
|
||||
|
||||
.header {
|
||||
padding: 20px;
|
||||
width: 100%;
|
||||
min-width: 350px;
|
||||
}
|
||||
|
||||
.header>h6>a {
|
||||
text-decoration: none;
|
||||
color: #262627;
|
||||
}
|
||||
|
||||
.header>h6>a:hover {
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
mat-card {
|
||||
min-width: 350px;
|
||||
}
|
||||
|
||||
.top-left-float {
|
||||
display: flex;
|
||||
min-width: 282px;
|
||||
}
|
||||
|
||||
.top-right-float {
|
||||
display: flex;
|
||||
min-width: 161px;
|
||||
}
|
||||
|
||||
.top-left-float>button,
|
||||
.top-right-float>button {
|
||||
margin: 5px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
mat-table {
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
display: table;
|
||||
overflow-x: scroll;
|
||||
.table-headers {
|
||||
padding: 5px;
|
||||
color: #ffffff;
|
||||
font-weight: 900;
|
||||
font-size: medium;
|
||||
background-color: #46AC9E;
|
||||
}
|
||||
|
||||
.table-headers:hover {
|
||||
background-color: #ececec;
|
||||
color:#46AC9E;
|
||||
}
|
||||
|
||||
.table-content {
|
||||
padding: 5px;
|
||||
overflow-wrap: inherit;
|
||||
}
|
||||
|
||||
.table-column {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
input {
|
||||
border: none;
|
||||
border-bottom: 1px solid silver;
|
||||
}
|
||||
|
||||
:host ::ng-deep .mat-slide-toggle.mat-checked:not(.mat-disabled) {
|
||||
|
||||
.mat-slide-toggle-thumb {
|
||||
background-color: #46AC9E;
|
||||
}
|
||||
|
||||
.mat-slide-toggle-bar {
|
||||
background-color: skyblue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// .dialog-body {
|
||||
// display: flex;
|
||||
// justify-content: center;
|
||||
// align-items: center;
|
||||
|
||||
// div {
|
||||
// width: 90%;
|
||||
// }
|
||||
// }
|
||||
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
width: 97%;
|
||||
justify-content: space-between;
|
||||
|
||||
.btn-group-left {
|
||||
// min-width: 150px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.btn-group-right {
|
||||
// min-width: 95px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
:host ::ng-deep {
|
||||
.mat-form-field-infix {
|
||||
border-bottom: 0px solid white;
|
||||
}
|
||||
|
||||
.mat-table {
|
||||
tr {
|
||||
|
||||
th,
|
||||
td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.img-fluid {
|
||||
margin-right: 5px;
|
||||
max-height: 40px;
|
||||
}
|
||||
|
||||
// .navbar {
|
||||
// background-position: center;
|
||||
// }
|
||||
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.card {
|
||||
min-width: 600px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.mat-row:nth-child(even){
|
||||
background-color: rgb(255, 255, 255);
|
||||
}
|
||||
|
||||
.mat-row:nth-child(odd){
|
||||
background-color: rgb(241, 241, 241);
|
||||
}
|
||||
@ -0,0 +1,344 @@
|
||||
import { Component, OnInit, EventEmitter, Input, Output,ViewChild } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { IgenMenuDto } from 'src/app/_dto/igenMenu.dto';
|
||||
import { MenuFormatDto } from 'src/app/_dto/menu-format.dto';
|
||||
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
|
||||
import { AuthService } from 'src/app/_providers/_services/auth.service';
|
||||
import { MenuService } from 'src/app/_providers/_services/menu.service';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
import { EmailService } from 'src/app/pages/auth/services';
|
||||
import { Observable, of } from 'rxjs';
|
||||
import { Email, User } from 'src/app/pages/auth/models';
|
||||
import { MatPaginator } from '@angular/material/paginator';
|
||||
import { MatSort, Sort } from '@angular/material/sort';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
import { routes } from 'src/app/consts';
|
||||
import { MasterService } from 'src/app/_providers/_services/master.service';
|
||||
<<<<<<< HEAD
|
||||
import { TenderDetailDto } from 'src/app/_dto/tender-detail.dto';
|
||||
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
@Component({
|
||||
selector: 'app-dashboard',
|
||||
templateUrl: './dashboard.component.html',
|
||||
styleUrls: ['./dashboard.component.scss']
|
||||
})
|
||||
export class DashboardComponent implements OnInit {
|
||||
|
||||
@Input() isMenuOpened: boolean;
|
||||
|
||||
@Output() isShowSidebar = new EventEmitter<boolean>();
|
||||
|
||||
public user$: Observable<User>
|
||||
|
||||
public emails$: Observable<Email[]>
|
||||
|
||||
public routers: typeof routes = routes;
|
||||
|
||||
schoolLogoPath: string;
|
||||
<<<<<<< HEAD
|
||||
|
||||
tenderData: any;
|
||||
|
||||
seculevel: string = ''
|
||||
|
||||
dataSource: MatTableDataSource<TenderDetailDto>;
|
||||
|
||||
displayedColumns :any;
|
||||
|
||||
dataCopy: any;
|
||||
|
||||
pageLength: any;
|
||||
|
||||
searchTerm:any;
|
||||
|
||||
@ViewChild('paginator') paginator: MatPaginator;
|
||||
|
||||
@ViewChild(MatSort, { static: false }) sort: MatSort;
|
||||
|
||||
noData: boolean;
|
||||
=======
|
||||
tenderData: any;
|
||||
seculevel: string = ''
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
constructor(
|
||||
private _menuService: MenuService,
|
||||
private router: Router,
|
||||
private _ui: UiService,
|
||||
private emailService: EmailService,
|
||||
private authenticationService: AuthService,
|
||||
<<<<<<< HEAD
|
||||
private _masterService: MasterService,
|
||||
private errorService:ErrorTranslateService
|
||||
=======
|
||||
private _masterService: MasterService
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
) {
|
||||
// this.user$ = this.getUser();
|
||||
this.seculevel = localStorage.getItem('seculevel')
|
||||
console.log('=====level====',this.seculevel);
|
||||
|
||||
// this.emails$ = this.emailService.loadEmails();
|
||||
// this.getSchoolLogo();
|
||||
<<<<<<< HEAD
|
||||
if(this.seculevel == 'B'){
|
||||
this.displayedColumns = ['actions','title','publishedDate','bidOpenDate','view'];
|
||||
}
|
||||
else{
|
||||
this.displayedColumns = ['slno','title','publishedDate','bidOpenDate','view','upload'];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// displayedColumns: string[] = ['no', 'name','download'];
|
||||
=======
|
||||
}
|
||||
|
||||
|
||||
displayedColumns: string[] = ['no', 'name','download'];
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
|
||||
loading: boolean = true;
|
||||
menuData: any;
|
||||
model: any;
|
||||
|
||||
|
||||
async ngOnInit() {
|
||||
|
||||
<<<<<<< HEAD
|
||||
|
||||
this.getData();
|
||||
|
||||
=======
|
||||
this._masterService.getMasterData(apiUrl.getTender).then((res) =>{
|
||||
console.log("tenderData",res);
|
||||
this.tenderData = res
|
||||
|
||||
|
||||
})
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
// await this._ui.userValidation()
|
||||
// this.loading = true;
|
||||
// this.getMenuData();
|
||||
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
getData(){
|
||||
if(this.seculevel != 'B')
|
||||
this._masterService.getMasterData(apiUrl.getTender).then((res) =>{
|
||||
console.log("tenderData=1=",res);
|
||||
this.tenderData = res;
|
||||
this.dataCopy = res;
|
||||
this.pageLength = this.tenderData.length;
|
||||
this.dataSource = new MatTableDataSource(this.tenderData);
|
||||
this.dataSource.sort = this.sort;
|
||||
this.dataSource.paginator = this.paginator;
|
||||
this.noData = (this.tenderData && this.tenderData.length == 0) ? true : false;
|
||||
this.loading = false;
|
||||
},err=>{
|
||||
console.error(err)
|
||||
})
|
||||
else
|
||||
this._masterService.getMasterData(apiUrl.adminTenderView).then((res) =>{
|
||||
console.log("tenderData=2=",res);
|
||||
this.tenderData = res;
|
||||
this.dataCopy = res;
|
||||
this.pageLength = this.tenderData.length;
|
||||
this.dataSource = new MatTableDataSource(this.tenderData);
|
||||
this.dataSource.sort = this.sort;
|
||||
this.dataSource.paginator = this.paginator;
|
||||
this.noData = (this.tenderData && this.tenderData.length == 0) ? true : false;
|
||||
this.loading = false;
|
||||
},err=>{
|
||||
console.error(err)
|
||||
})
|
||||
}
|
||||
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
addNewTender(){
|
||||
this.navigateTo('/add-tenders')
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
|
||||
sortData(sort: Sort) {
|
||||
const data = this.tenderData.slice();
|
||||
if (!sort.active || sort.direction === '') {
|
||||
this.dataSource.data = data;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
this.dataSource.data = data.sort((a, b) => {
|
||||
const isAsc = sort.direction === 'asc';
|
||||
switch (sort.active) {
|
||||
case 'title':
|
||||
return compare(a.title, b.title, isAsc);
|
||||
case 'publishedDate':
|
||||
return compare(a.publishDate, b.publishDate, isAsc);
|
||||
case 'bidOpenDate':
|
||||
return compare(a.bidOpenDate, b.bidOpenDate, isAsc);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
search(){
|
||||
this.tenderData = this.dataCopy;
|
||||
this.loading = true;
|
||||
if (!this.searchTerm || this.searchTerm == null || this.searchTerm == undefined || this.searchTerm == "") {
|
||||
this._ui.toastMessage(this.errorService.translate('enterSearchTerm'), 3000);
|
||||
this.getData();
|
||||
return;
|
||||
}
|
||||
this.tenderData = this.tenderData.filter(res => {
|
||||
let includedInTitle = (res.title) ? res.title.toLowerCase().includes(this.searchTerm.toLowerCase()) : false;
|
||||
let includedInPublishDate = (res.publishDate) ? res.publishDate.includes(this.searchTerm.toLowerCase()) : false;
|
||||
|
||||
let includedInbidOpenDate = (res.bidOpenDate) ? res.bidOpenDate.includes(this.searchTerm.toLowerCase()) : false;
|
||||
|
||||
if (includedInTitle)
|
||||
return true;
|
||||
if (includedInPublishDate)
|
||||
return true;
|
||||
if (includedInbidOpenDate)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
});
|
||||
this.noData = (this.tenderData && this.tenderData.length == 0) ? true : false;
|
||||
this.pageLength = this.tenderData.length;
|
||||
this.dataSource = new MatTableDataSource(this.tenderData);
|
||||
this.loading = false;
|
||||
}
|
||||
|
||||
reset(){
|
||||
this.searchTerm = "";
|
||||
this.getData();
|
||||
}
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
// navigateTo(destination) {
|
||||
// this.router.navigate([destination]);
|
||||
// }
|
||||
|
||||
// async getMenuData() {
|
||||
// this.menuData = []
|
||||
// await this._menuService.getJsonData("sales-menu").then((res) => {
|
||||
// res.forEach(element => {
|
||||
// if (element.menuEnabled == "Y")
|
||||
// this.menuData.push(element)
|
||||
// });
|
||||
// // this.menuData = res;
|
||||
// this.loading = false;
|
||||
// this.model = this.getMenuCompact(this.menuData, "root");
|
||||
// },
|
||||
// (err) => {
|
||||
// console.log("===err====", err);
|
||||
// });
|
||||
|
||||
// }
|
||||
// getMenuCompact(menuList: IgenMenuDto[], parentMenuId: string, menuCompactData?: MenuFormatDto[]) {
|
||||
// if (!parentMenuId)
|
||||
// return [];
|
||||
// if (!menuCompactData)
|
||||
// menuCompactData = [];
|
||||
// for (let menu of menuList) {
|
||||
// if (menu.parentMenuId == parentMenuId && menu.menuEnabled == "Y") {
|
||||
// let format: MenuFormatDto = { menuId: menu.menuId, icon: menu.icon, label: menu.description, langaugeLabelCode: menu.languageLabelCode, data: { description: menu.description, langaugeLabelCode: menu.languageLabelCode, menuId: menu.menuId, rightsGiven: menu.rightsGiven } };
|
||||
// if (menu["isMegaMenu"]) format["isExpanded"] = true; else format["isExpanded"] = false;
|
||||
// if (menu["isSideMenu"]) format["isSideMenu"] = true; else format["isSideMenu"] = false;
|
||||
// if (menu["routerLink"]) format["routerLink"] = menu["routerLink"];
|
||||
// // if (menu.menuType == "1") format["isExpanded"] = true;
|
||||
// // if (menu.menuType != "1") format["isExpanded"] = false;
|
||||
// // if (menu["routerLink"] === this.router.url) this.service.selectedMenu = format;
|
||||
// if (menu["menuType"]) format["menuType"] = menu["menuType"];
|
||||
// if (menu.menuType == "1") format["items"] = this.getMenuCompact(menuList, menu.menuId)
|
||||
// if (menu["role"]) format["role"] = menu["role"];
|
||||
// if (menu["project"]) format["project"] = menu["project"];
|
||||
// if (this.seculevel == 'admin')
|
||||
// menuCompactData.push(format);
|
||||
// else {
|
||||
// if (menu.role != 'admin') {
|
||||
// menuCompactData.push(format);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// return menuCompactData;
|
||||
// }
|
||||
|
||||
|
||||
public openMenu(): void {
|
||||
this.isMenuOpened = !this.isMenuOpened;
|
||||
|
||||
this.isShowSidebar.emit(this.isMenuOpened);
|
||||
}
|
||||
|
||||
public signOut(): void {
|
||||
|
||||
this.authenticationService.logOut();
|
||||
|
||||
}
|
||||
|
||||
signIn(){
|
||||
this.router.navigate(['/login']);
|
||||
}
|
||||
|
||||
goToHome(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
goToView(tenderId) {
|
||||
this.router.navigate(['/tender-view',tenderId]);
|
||||
}
|
||||
|
||||
goToAddTenders(){
|
||||
this.router.navigate(['/add-tenders']);
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
goToUpload(tenderId){
|
||||
this.router.navigate(['/tender-upload',tenderId]);
|
||||
=======
|
||||
goToUpload(){
|
||||
this.router.navigate(['/tender-upload']);
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
goToEdit(tenderId){
|
||||
this.router.navigate(['/add-tenders',tenderId]);
|
||||
}
|
||||
Cancel(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
// public getUser(): Observable<User> {
|
||||
// return of({
|
||||
// email: localStorage.getItem('username'),
|
||||
// name: localStorage.getItem('username'),
|
||||
|
||||
// });
|
||||
// }
|
||||
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
function compare(a: any, b: any, isAsc: boolean): number {
|
||||
return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
|
||||
}
|
||||
@ -0,0 +1,88 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
import { DashboardRoutingModule } from './dashboard-routing.module';
|
||||
import { LayoutComponentComponent } from './layout-component/layout-component.component';
|
||||
import { DashboardComponent } from './dashboard.component';
|
||||
import { SharedModule } from 'src/app/shared/shared.module';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { MatCardModule } from '@angular/material/card';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatPaginatorModule } from '@angular/material/paginator';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { MatSortModule } from '@angular/material/sort';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { HomeViewComponent } from './home-view/home-view.component';
|
||||
import { HomeUploadComponent } from './home-upload/home-upload.component';
|
||||
import { ReactiveFormsModule } from '@angular/forms';
|
||||
import { TenderHomeComponent } from './tender-home/tender-home.component';
|
||||
import { AddTendersComponent } from './add-tenders/add-tenders.component';
|
||||
import { MatTabsModule } from '@angular/material/tabs';
|
||||
import { MatDatepickerModule } from '@angular/material/datepicker';
|
||||
import { MatNativeDateModule } from '@angular/material/core';
|
||||
<<<<<<< HEAD
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { MatMomentDateModule } from '@angular/material-moment-adapter';
|
||||
import {MatTooltipModule} from '@angular/material/tooltip';
|
||||
// import { NgxMatTimepickerModule } from 'ngx-mat-timepicker';
|
||||
import { LOCALE_ID } from '@angular/core';
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
// import { MatTimepickerModule } from 'mat-timepicker';
|
||||
// import { MatTimepickerModule } from '@angular/material/timepicker';
|
||||
// import { MatSelectModule } from '@angular/material';
|
||||
const lang = 'en-US';
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
LayoutComponentComponent,
|
||||
DashboardComponent,
|
||||
HomeViewComponent,
|
||||
HomeUploadComponent,
|
||||
TenderHomeComponent,
|
||||
AddTendersComponent,
|
||||
|
||||
],
|
||||
imports: [
|
||||
CommonModule,
|
||||
DashboardRoutingModule,
|
||||
SharedModule,
|
||||
MatProgressBarModule,
|
||||
MatCardModule,
|
||||
MatIconModule,
|
||||
MatTableModule,
|
||||
MatInputModule,
|
||||
MatButtonModule,
|
||||
MatPaginatorModule,
|
||||
MatSlideToggleModule,
|
||||
FormsModule,
|
||||
MatSortModule,
|
||||
TranslateModule,
|
||||
ReactiveFormsModule,
|
||||
MatTabsModule,
|
||||
<<<<<<< HEAD
|
||||
MatSelectModule,
|
||||
MatNativeDateModule,
|
||||
MatDatepickerModule,
|
||||
MatMomentDateModule,
|
||||
MatTooltipModule
|
||||
// NgxMatTimepickerModule.setLocale(lang),
|
||||
// NgxMaterialTimepickerModule
|
||||
// MatTimepickerModule
|
||||
|
||||
|
||||
],
|
||||
providers: [{ provide: LOCALE_ID, useValue: lang }]
|
||||
=======
|
||||
|
||||
MatNativeDateModule,
|
||||
MatDatepickerModule
|
||||
]
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
})
|
||||
export class DashboardModule { }
|
||||
@ -0,0 +1,167 @@
|
||||
<<<<<<< HEAD
|
||||
<div class="container-responsive" *ngIf="secuLevel !='B'">
|
||||
=======
|
||||
<div class="container-responsive">
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link tender-link" (click)="navigateTo('dashboard')">Tender</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToHome()">Home</p>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<nav class="navbar navbar-dark-responsive"
|
||||
style="background-image: url('assets/img/panel_background.jpg');padding: 50px;"> -->
|
||||
<!-- <div class="container-fluid">
|
||||
<a class="navbar-brand" (click)="navigateTo('tender-view')">
|
||||
<h6>Home / Tender</h6>
|
||||
</a>
|
||||
</div> -->
|
||||
|
||||
<!-- </nav> -->
|
||||
<mat-progress-bar *ngIf="loading" mode="indeterminate" color="warn"></mat-progress-bar>
|
||||
<br>
|
||||
<div class="text-center mt-4">
|
||||
<h2 class="font-weight-bold " style="color: #5faca1;">Upload Files <i class="bi bi-cloud-upload"></i></h2>
|
||||
</div><br>
|
||||
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-6 offset-sm-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="form-group">
|
||||
<form (ngSubmit)="submitForm()" #myForm="ngForm">
|
||||
<div class="form-group">
|
||||
<label for="name">Name</label>
|
||||
<input type="text" class="form-control" id="name" placeholder="Enter your name" [(ngModel)]="formData.name" name="name" required>
|
||||
<div *ngIf="myForm.submitted && myForm.controls.name.errors">
|
||||
<div *ngIf="myForm.controls.name.errors.required" class="text-danger">
|
||||
Name is required.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="phone">Phone Number</label>
|
||||
<input type="text" class="form-control" id="phone" placeholder="Enter your phone number" [(ngModel)]="formData.phone" name="phone" required pattern="[0-9]{10}" [ngModelOptions]="{ updateOn: 'blur' }" >
|
||||
<!-- Error messages for required and pattern -->
|
||||
<div *ngIf="myForm.submitted && myForm.controls.phone.errors">
|
||||
<div *ngIf="myForm.controls.phone.errors.required" class="text-danger">
|
||||
Phone number is required.
|
||||
</div>
|
||||
<div *ngIf="myForm.controls.phone.errors.pattern" class="text-danger">
|
||||
Phone number must be a 10-digit number.
|
||||
</div>
|
||||
<div *ngIf="phoneInvalid" class="text-danger">
|
||||
Invalid phone number format.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" class="form-control" id="email" placeholder="Enter your email" [(ngModel)]="formData.email" name="email" required email>
|
||||
<div *ngIf="myForm.submitted && myForm.controls.email.errors">
|
||||
<div *ngIf="myForm.controls.email.errors.required" class="text-danger">
|
||||
Email is required.
|
||||
</div>
|
||||
<div *ngIf="myForm.controls.email.errors.email" class="text-danger">
|
||||
Invalid email format.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table id="customers">
|
||||
<tr>
|
||||
<th style="width:30%;text-align: center;">Description</th>
|
||||
<th style="text-align: center;">Document</th>
|
||||
<!-- <th>Country</th> -->
|
||||
</tr>
|
||||
|
||||
<tr *ngFor="let i of a">
|
||||
<td></td>
|
||||
<td>
|
||||
<div class="form-group">
|
||||
<!-- <label for="file1">File 1:</label> -->
|
||||
<div class="input-group">
|
||||
<input type="file" id="file1" class="form-control">
|
||||
<button class="btn btn-outline-secondary delete-btn" (click)="deleteInput('file1')" type="button">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<!-- <div class="form-group">
|
||||
<label for="file3">File 3:</label>
|
||||
<div class="input-group">
|
||||
<input type="file" id="file3" class="form-control" aria-describedby="button-addon1" [(ngModel)]="formData.file3" name="file3">
|
||||
<button class="btn btn-outline-secondary delete-btn" (click)="deleteInput('file3')" type="button">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div> -->
|
||||
<div *ngIf="myForm.submitted && myForm.invalid" class="text-danger">
|
||||
Please fill in all required fields.
|
||||
</div>
|
||||
<button type="submit" style="margin-top: 10px;" class="btn btn-outline-dark float-right" >Submit</button>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<br><br>
|
||||
|
||||
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px;"
|
||||
class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023.
|
||||
</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>
|
||||
</footer>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
@ -0,0 +1,25 @@
|
||||
#customers {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#customers td, #customers th {
|
||||
border: 1px solid #ddd;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
#customers tr:nth-child(even){background-color: #f2f2f2;}
|
||||
|
||||
#customers tr:hover {background-color: #ddd;}
|
||||
|
||||
#customers th {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px;
|
||||
text-align: left;
|
||||
background-color: #5FACA1;
|
||||
color: white;
|
||||
}
|
||||
.nav-link:hover {
|
||||
color: rgb(255, 0, 0);
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { HomeUploadComponent } from './home-upload.component';
|
||||
|
||||
describe('HomeUploadComponent', () => {
|
||||
let component: HomeUploadComponent;
|
||||
let fixture: ComponentFixture<HomeUploadComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ HomeUploadComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(HomeUploadComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,84 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormGroup } from '@angular/forms';
|
||||
import { Router } from '@angular/router';
|
||||
import { log } from 'console';
|
||||
import { ErrorTranslateService } from 'src/app/_providers/_services/error-translate.service';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-home-upload',
|
||||
templateUrl: './home-upload.component.html',
|
||||
styleUrls: ['./home-upload.component.scss']
|
||||
})
|
||||
export class HomeUploadComponent implements OnInit {
|
||||
|
||||
phoneInvalid: boolean = false;
|
||||
|
||||
secuLevel:any;
|
||||
|
||||
formData: any = {};
|
||||
|
||||
myForm: FormGroup;
|
||||
|
||||
loading: boolean = true
|
||||
<<<<<<< HEAD
|
||||
|
||||
a=[{},{},{},{}]
|
||||
=======
|
||||
a=[{},{},{},{}]
|
||||
constructor(private router: Router) { }
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
constructor(private router: Router,private _ui:UiService,private _errorTranslate: ErrorTranslateService) {
|
||||
this.secuLevel = localStorage.getItem('seculevel');
|
||||
}
|
||||
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
|
||||
|
||||
goToHome(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
preSave(){
|
||||
if(this.formData.name == '' || this.formData.name == undefined){
|
||||
console.log("1");
|
||||
|
||||
return false
|
||||
}
|
||||
if(this.formData.phone == '' || this.formData.phone == undefined || this.formData.phone.length > 10 || this.formData.phone.length < 10){
|
||||
console.log("ph");
|
||||
return false
|
||||
}
|
||||
if(!this._ui.phoneNoValidation(this.formData.phone)){
|
||||
this._ui.toastMessage(this._errorTranslate.translate('enterAValidPhoneNumber'));
|
||||
return false;
|
||||
}
|
||||
if(this.formData.email == '' || this.formData.email == undefined){
|
||||
console.log("e");
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
submitForm() {
|
||||
if(this.preSave())
|
||||
console.log(this.formData);
|
||||
}
|
||||
|
||||
deleteInput(inputFieldId: string) {
|
||||
const inputField = document.getElementById(inputFieldId) as HTMLInputElement;
|
||||
if (inputField) {
|
||||
inputField.value = '';
|
||||
}
|
||||
}
|
||||
ngOnInit(): void {
|
||||
this.loading = false
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,555 @@
|
||||
<div class="container-responsive">
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link tender-link" (click)="navigateTo('auth/admin-home')">Tender</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToHome()">Home</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<nav class="navbar navbar-dark-responsive"
|
||||
style="background-image: url('assets/img/panel_background.jpg');padding: 50px;"> -->
|
||||
<!-- <div class="container-fluid"> -->
|
||||
<!-- <a class="navbar-brand" (click)="navigateTo('tender-view')">
|
||||
<h6>Home / Tender</h6>
|
||||
</a> -->
|
||||
<!-- </div> -->
|
||||
|
||||
<!-- </nav> -->
|
||||
<!-- <mat-progress-bar mode="indeterminate" color="warn"></mat-progress-bar> -->
|
||||
<br>
|
||||
<div class="text-center mt-4">
|
||||
<h2 class="font-weight-bold " style="color: #5faca1;">Tender Details </h2>
|
||||
</div><br>
|
||||
|
||||
|
||||
<div class="row d-flex justify-content-center ">
|
||||
<div class="col-sm-11 ">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Basic Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th >Organisation Name</th>
|
||||
<<<<<<< HEAD
|
||||
<td class="col-md-6" >{{tenderData?.orgChain}}</td>
|
||||
=======
|
||||
<td class="col-md-6" >{{tenderData.orgChain}}</td>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Reference Number</th>
|
||||
<td>{{tenderData.tenderRefNo}}</td>
|
||||
<<<<<<< HEAD
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender ID</th>
|
||||
<td>{{tenderData.tenderId}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Type</th>
|
||||
<td>{{tenderData.tenderTypeD.tenderType}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Category</th>
|
||||
<td>{{tenderData.tenderCategoryD.tenderCategory}}</td>
|
||||
=======
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender ID</th>
|
||||
<td>{{tenderData.tenderId}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Type</th>
|
||||
<td>{{tenderData.tenderType}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Category</th>
|
||||
<td>{{tenderData.tenderCategoryD.tenderCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Payment Mode</th>
|
||||
<td>{{tenderData.paymentModeD.paymentMode}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Form of Contract</th>
|
||||
<td>{{tenderData.formOfContractD.formOfContract}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>No. of Covers</th>
|
||||
<td>{{tenderData.noOfCovers}}</td>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Payment Mode</th>
|
||||
<td>{{tenderData.paymentModeD.paymentMode}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Form of Contract</th>
|
||||
<td>{{tenderData.formOfContractD.formOfContract}}</td>
|
||||
</tr>
|
||||
<!-- <tr>
|
||||
<th>No. of Covers</th>
|
||||
<td>{{tenderData.noOfCovers}}</td>
|
||||
</tr> -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Tender Fee Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Tender Fee in ₹</th>
|
||||
<td class="col-md-7" >{{tenderData.tenderFee}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Fee Payable To</th>
|
||||
<td>{{tenderData.feePayableTo}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Fee Exemption Allowed</th>
|
||||
<td>{{tenderData.tenderFeeExemption}}</td>
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Fee Payable At</th>
|
||||
<td>{{tenderData.feePayableAt}}</td>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
<!-- <tr>
|
||||
<th>Fee Payable At</th>
|
||||
<td>{{tenderData.feePayableAt}}</td>
|
||||
</tr> -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">EMD Fee Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th >EMD Amount in ₹</th>
|
||||
<td class="col-md-6" >{{tenderData.emdAmt}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD Fee Type</th>
|
||||
<<<<<<< HEAD
|
||||
<td>{{tenderData.emdFeeTypeD.emdFeeType}}</td>
|
||||
=======
|
||||
<td>{{tenderData.emdFeeType}}</td>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD Payable To</th>
|
||||
<td>{{tenderData.emdPayableTo}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD through BG/ST or EMD Exemption Allowed</th>
|
||||
<td>{{tenderData.allowEmdBgOrSt}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>EMD Percentage</th>
|
||||
<td>{{tenderData.emdPercentage}}</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Critical Dates</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th >Published Date</th>
|
||||
<td class="col-md-6" >{{tenderData.publishDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Document Download / Sale Start Date</th>
|
||||
<td>{{tenderData.saleStartDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Clarification Start Date</th>
|
||||
<td>{{tenderData.clarificationStartDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Submission Start Date</th>
|
||||
<td>{{tenderData.bidSubStartDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Opening Date</th>
|
||||
<td>{{tenderData.bidOpenDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Document Download / Sale End Date</th>
|
||||
<td>{{tenderData.saleEndDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pincode</th>
|
||||
<td>{{tenderData.pincode}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Clarification End Date</th>
|
||||
<td>{{tenderData.clarificationEndDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Submission End Date</th>
|
||||
<td>{{tenderData.bidSubEndDate}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Work Item Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Title</th>
|
||||
<td class="col-md-6">{{tenderData.title}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Work Description</th>
|
||||
<td>{{tenderData.workDesc}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Qualification</th>
|
||||
<td>{{tenderData.ndaPreQualification}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Independent External Monitor/Remarks</th>
|
||||
<td>{{tenderData.remarks}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Tender Value in ₹</th>
|
||||
<td>{{tenderData.tenderValue}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Contract Type</th>
|
||||
<td>{{tenderData.contractType}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Location</th>
|
||||
<td>{{tenderData.location}}</td>
|
||||
</tr>
|
||||
<<<<<<< HEAD
|
||||
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Address</th>
|
||||
<td>{{tenderData.preBidMeetAdd}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Product Category</th>
|
||||
<td>{{tenderData.productCategoryD.productCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Validity(Days)</th>
|
||||
<td>{{tenderData.bidValidity}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Date</th>
|
||||
<td>{{tenderData.preBidDate}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Sub category</th>
|
||||
<td>{{tenderData.subCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Period Of Work(Days)</th>
|
||||
<td>{{tenderData.periodOfWork}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Place</th>
|
||||
<td>{{tenderData.preBidMeetPlace}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Opening Place</th>
|
||||
<td>{{tenderData.bidOpeningPlace}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
=======
|
||||
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Address</th>
|
||||
<td>{{tenderData.preBidMeetAdd}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Product Category</th>
|
||||
<td>{{tenderData.productCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Validity(Days)</th>
|
||||
<td>{{tenderData.bidValidity}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Date</th>
|
||||
<td>{{tenderData.preBidMeetAdd}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Sub category</th>
|
||||
<td>{{tenderData.subCategory}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Period Of Work(Days)</th>
|
||||
<td>{{tenderData.periodOfWork}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Pre Bid Meeting Place</th>
|
||||
<td>{{tenderData.preBidMeetPlace}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Bid Opening Place</th>
|
||||
<td>{{tenderData.bidOpeningPlace}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="12">Tenders Documents</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<<<<<<< HEAD
|
||||
<th colspan="12" class="text-center" style="background-color: #b8b8b8;" >Drawings Document</th>
|
||||
=======
|
||||
<th colspan="12" class="text-center" style="background-color: #b8b8b8;" >NIT Document</th>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<<<<<<< HEAD
|
||||
<th colspan="12">Drawings <button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="DownloadDrawings()"> <i class="bi bi-file-earmark-zip"></i> Download</button></th>
|
||||
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="12"></td>
|
||||
</tr>
|
||||
|
||||
|
||||
=======
|
||||
<th colspan="5">Document Name</th>
|
||||
<th colspan="7">Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="5"></td>
|
||||
<td colspan="7"></td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<th colspan="12"><span id="zipFile"> <i class="bi bi-file-earmark-zip"></i> Download</span> </th>
|
||||
</tr>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
</tbody>
|
||||
<br>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<th colspan="12" class="text-center" style="background-color:#b8b8b8;" >Work Item Documents</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Document Type</th>
|
||||
<th colspan="4">Document Name</th>
|
||||
<th colspan="4">Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<<<<<<< HEAD
|
||||
<th colspan="12"><button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="downloadZip()"> <i class="bi bi-file-earmark-zip" ></i> Download as Zip File</button> </th>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<th colspan="12" class="text-center" style="background-color:#b8b8b8;" >NIT Item Documents</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Document Type</th>
|
||||
<th colspan="4">Document Name</th>
|
||||
<th colspan="4">Description</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<th colspan="12"><button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="downloadZip()"> <i class="bi bi-file-earmark-zip" ></i> Download as Zip File</button> </th>
|
||||
=======
|
||||
<th colspan="12"><button mat-raised-button (click)="downloadZip()"> <i class="bi bi-file-earmark-zip" ></i> Download as Zip File</button> </th>
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<<<<<<< HEAD
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="12">Required Documents Details</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th colspan="4">Document Type</th>
|
||||
<th colspan="4">Description</th>
|
||||
<th colspan="4">Document Format</th>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<th colspan="12"><button mat-raised-button id="zipFile" class=" float-right btn-sm" (click)="downloadZip()"> <i class="bi bi-file-earmark-zip" ></i> Download as Zip File</button> </th>
|
||||
|
||||
</tr>
|
||||
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
=======
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th colspan="2">Tender Inviting</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<td class="col-md-6" >{{tenderData.tenderInvName}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Address</th>
|
||||
<td>{{tenderData.tenderInvAddess}}</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
|
||||
</div><br>
|
||||
</div>
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;"
|
||||
class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023.
|
||||
</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>
|
||||
</footer>
|
||||
@ -0,0 +1,51 @@
|
||||
.container-fluid{
|
||||
width: 100%;
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
top: 10px;
|
||||
position: relative;
|
||||
}
|
||||
.container-fluid2{
|
||||
width: 100%;
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
top: -1px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.table td {
|
||||
word-break: break-word;
|
||||
}
|
||||
.nav-link:hover {
|
||||
color: rgb(255, 0, 0);
|
||||
}
|
||||
#zipFile:hover {
|
||||
color: rgb(255, 0, 0);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
// .container-responsive {
|
||||
// min-height: 100vh;
|
||||
// position: relative;
|
||||
// }
|
||||
|
||||
// #footer {
|
||||
// background-color: #3a8379;
|
||||
// padding: 20px;
|
||||
// color: #ffffff;
|
||||
// position: absolute;
|
||||
// bottom: 0;
|
||||
// width: 100%;
|
||||
// }
|
||||
|
||||
thead{
|
||||
<<<<<<< HEAD
|
||||
background-color: #5faca1; color: aliceblue;
|
||||
=======
|
||||
background-color: rgb(161, 42, 42); color: aliceblue;
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { HomeViewComponent } from './home-view.component';
|
||||
|
||||
describe('HomeViewComponent', () => {
|
||||
let component: HomeViewComponent;
|
||||
let fixture: ComponentFixture<HomeViewComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ HomeViewComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(HomeViewComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,156 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { apiUrl } from 'src/app/_providers/_resources/api-url.properties';
|
||||
import { MasterService } from 'src/app/_providers/_services/master.service';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
@Component({
|
||||
selector: 'app-home-view',
|
||||
templateUrl: './home-view.component.html',
|
||||
styleUrls: ['./home-view.component.scss']
|
||||
})
|
||||
export class HomeViewComponent implements OnInit {
|
||||
|
||||
tenderId: number;
|
||||
tenderData: any;
|
||||
<<<<<<< HEAD
|
||||
|
||||
constructor(private router: Router,
|
||||
private route: ActivatedRoute,
|
||||
private _masterService: MasterService) {
|
||||
this.tenderId = +this.route.snapshot.paramMap.get('id');
|
||||
this.getData()
|
||||
=======
|
||||
|
||||
constructor(private router: Router,
|
||||
private route: ActivatedRoute,
|
||||
private _masterService: MasterService) {
|
||||
this.tenderId = +this.route.snapshot.paramMap.get('id');
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
<<<<<<< HEAD
|
||||
console.log("this.tenderId", this.tenderId);
|
||||
this.getData()
|
||||
}
|
||||
|
||||
|
||||
|
||||
getData() {
|
||||
this._masterService.getMasterDatabyId(apiUrl.AllTenderData, this.tenderId).then((res) => {
|
||||
console.log("tenderData", res);
|
||||
this.tenderData = res
|
||||
})
|
||||
=======
|
||||
console.log("this.tenderId",this.tenderId);
|
||||
this.getData()
|
||||
}
|
||||
|
||||
getData(){
|
||||
this._masterService.getMasterDatabyId(apiUrl.AllTenderData,this.tenderId).then((res) =>{
|
||||
console.log("tenderData",res);
|
||||
this.tenderData = res})
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
|
||||
goToHome() {
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs() {
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
DownloadDrawings(){
|
||||
const id = this.tenderId;
|
||||
this._masterService.getMasterDatabyId(apiUrl.drawingsDownloadDocs,id).then((res)=>{
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
downloadZip() {
|
||||
console.log('clicked');
|
||||
const id = this.tenderId;
|
||||
// let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
// setTimeout(() => {
|
||||
// newWindow.close();
|
||||
// }, 10);
|
||||
|
||||
this._masterService.getMasterDatabyId(apiUrl.bankDocs, id).then(res => {
|
||||
|
||||
}, err => {
|
||||
console.log('res===>', err);
|
||||
if (err.status == 200) {
|
||||
console.log('start >>>');
|
||||
// window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
setTimeout(() => {
|
||||
newWindow.close();
|
||||
}, 100);
|
||||
}
|
||||
if (err.status == 404) {
|
||||
alert('No Bank Document Found for the selected Tender.');
|
||||
}
|
||||
if (err.status == 500) {
|
||||
alert(`${err.message}`);
|
||||
}
|
||||
else {
|
||||
alert(`An error Occured`);
|
||||
// let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
// setTimeout(() => {
|
||||
// newWindow.close();
|
||||
// }, 100);
|
||||
}
|
||||
|
||||
})
|
||||
// window.open('http://192.168.1.112:3500/api/v1/file-upload/Bank-Documents-Arc/'+id);
|
||||
|
||||
=======
|
||||
|
||||
downloadZip(){
|
||||
console.log('clicked');
|
||||
const id = this.tenderId;
|
||||
// let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
// setTimeout(() => {
|
||||
// newWindow.close();
|
||||
// }, 10);
|
||||
|
||||
this._masterService.getMasterDatabyId(apiUrl.bankDocs,id).then(res=>{
|
||||
|
||||
},err=>{
|
||||
console.log('res===>',err);
|
||||
if(err.status == 200){
|
||||
console.log('start >>>');
|
||||
// window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
setTimeout(() => {
|
||||
newWindow.close();
|
||||
}, 100);
|
||||
}
|
||||
if(err.status == 404){
|
||||
alert('No Bank Document Found for the selected Tender.');
|
||||
}
|
||||
if(err.status == 500){
|
||||
alert(`${err.message}`);
|
||||
}
|
||||
else{
|
||||
alert(`An error Occured`);
|
||||
// let newWindow = window.open(`${environment.apiUrl}/${apiUrl.bankDocs}/${id}`);
|
||||
// setTimeout(() => {
|
||||
// newWindow.close();
|
||||
// }, 100);
|
||||
}
|
||||
|
||||
})
|
||||
// window.open('http://192.168.1.112:3500/api/v1/file-upload/Bank-Documents-Arc/'+id);
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
<!-- <app-layout> -->
|
||||
<!-- <div class="row" style="width:100%"> -->
|
||||
<router-outlet></router-outlet>
|
||||
<app-footer></app-footer>
|
||||
<!-- </div> -->
|
||||
<!-- </app-layout> -->
|
||||
@ -0,0 +1,19 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { UiService } from 'src/app/_providers/_services/ui.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-layout-component',
|
||||
templateUrl: './layout-component.component.html',
|
||||
styleUrls: ['./layout-component.component.css']
|
||||
})
|
||||
export class LayoutComponentComponent implements OnInit {
|
||||
|
||||
constructor(
|
||||
private _ui: UiService,
|
||||
) { }
|
||||
|
||||
async ngOnInit() {
|
||||
await this._ui.userValidation()
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,93 @@
|
||||
<div class="container-responsive">
|
||||
<!-- <nav class="navbar navbar-expand-lg" style="padding: 16.5px;">
|
||||
<div class="container">
|
||||
<p class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assets/img/emblem2.jpg" alt="" class="img-fluid" style="height: 40px;">
|
||||
Thrickodithanam SCB
|
||||
</p>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarNav">
|
||||
<ul class="navbar-nav"> -->
|
||||
<!-- <li class="nav-item">
|
||||
<p class="nav-link home-link">Add Tenders</p>
|
||||
</li> -->
|
||||
<!-- <li class="nav-item">
|
||||
<p class="nav-link home-link" (click)="goToHome()">Home</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link contact-link" (click)="goToContactUs()">Contact Us</p>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<p class="nav-link sign-out-link" (click)="signOut()">Sign In <i class="bi bi-person-plus-fill"></i></p>
|
||||
</li> -->
|
||||
<!-- <li class="nav-item">
|
||||
<p class="nav-link sign-out-link" (click)="signOut()">Sign Out <i class="bi bi-person-x-fill"></i></p>
|
||||
</li> -->
|
||||
<!-- </ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
<nav class="navbar navbar-dark-responsive" style="background-image: url('assets/img/panel_background.jpg');padding: 50px;">
|
||||
</nav> -->
|
||||
|
||||
|
||||
|
||||
<!-- <mat-progress-bar mode="indeterminate" color="warn"></mat-progress-bar> -->
|
||||
<br><br>
|
||||
|
||||
<div class="container text-center">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card-responsive">
|
||||
<div class="card-body-responsive">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th class="col-sm-1">#</th>
|
||||
<th class="col-sm-9">TENDER NAME</th>
|
||||
<th class="col-sm-1">VIEW</th>
|
||||
<th class="col-sm-1">UPLOAD</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let tender of data; let i = index">
|
||||
<td class="col-sm-1">{{ i + 1 }}</td>
|
||||
<td class="col-sm-9 table-break-word">{{ tender.name }}</td>
|
||||
<td class="col-sm-1">
|
||||
<button type="button" class="btn btn-outline-danger btn-sm" (click)="goToView()">View <i
|
||||
class="bi bi-card-list"></i></button>
|
||||
</td>
|
||||
<td class="col-sm-1" >
|
||||
<button type="button" class="btn btn-outline-dark btn-sm" (click)="goToUpload()">Upload <i class="bi bi-upload"></i></button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div><br><br>
|
||||
<div class="footer" class="fixed-bottom">
|
||||
<footer id="footer" style="background-color: #48746e; padding: 70px 0; color: #ffffff; font-size: 16px; bottom: 0;" class="py-3">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<p class="mb-0">© <span style="font-weight: bolder;font-family: sans-serif;">Thrickodithanamscb 2023. </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>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
@ -0,0 +1,72 @@
|
||||
// .header {
|
||||
// margin-left: 4%;
|
||||
// margin-top: 20px;
|
||||
// }
|
||||
|
||||
// .header>h6{
|
||||
// a {
|
||||
// text-decoration: none;
|
||||
// color: #262627;
|
||||
// }
|
||||
|
||||
// a:hover {
|
||||
// text-decoration: underline;
|
||||
// cursor: pointer;
|
||||
// }
|
||||
// }
|
||||
|
||||
// mat-card{
|
||||
// min-width: 180px ;
|
||||
// // max-width: 20vw;
|
||||
// height: 200px;
|
||||
// display: inline-block;
|
||||
// }
|
||||
|
||||
// mat-card:hover{
|
||||
// cursor: pointer;
|
||||
// }
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
.nav-link:hover {
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
th,
|
||||
td {
|
||||
padding: 10px;
|
||||
border: 1px solid #ccc;
|
||||
white-space: nowrap;
|
||||
|
||||
}
|
||||
|
||||
.h2 {
|
||||
font-family: sans-serif;
|
||||
font-size: 26px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
|
||||
.table td {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.table-break-word {
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.img-fluid {
|
||||
margin-right: 5px;
|
||||
max-height: 40px;
|
||||
}
|
||||
|
||||
// .navbar {
|
||||
// background-position: center;
|
||||
// }
|
||||
@ -0,0 +1,25 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { TenderHomeComponent } from './tender-home.component';
|
||||
|
||||
describe('TenderHomeComponent', () => {
|
||||
let component: TenderHomeComponent;
|
||||
let fixture: ComponentFixture<TenderHomeComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [ TenderHomeComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(TenderHomeComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,67 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { AuthService } from 'src/app/_providers/_services/auth.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-tender-home',
|
||||
templateUrl: './tender-home.component.html',
|
||||
styleUrls: ['./tender-home.component.scss']
|
||||
})
|
||||
export class TenderHomeComponent implements OnInit {
|
||||
|
||||
|
||||
|
||||
displayedColumns: string[] = ['no', 'name','download'];
|
||||
data:any[] = [
|
||||
{ no:1,name:'Tender 1', city: 'New York' },
|
||||
{ no:2 , name:'Tender 2', city: 'London' },
|
||||
{ no:3 , name:'Tender 3', city: 'Paris' },
|
||||
|
||||
];
|
||||
constructor( private authenticationService: AuthService,
|
||||
private router: Router,) { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
public signOut(): void {
|
||||
|
||||
this.authenticationService.logOut();
|
||||
|
||||
}
|
||||
|
||||
signIn(){
|
||||
this.router.navigate(['/login']);
|
||||
}
|
||||
|
||||
goToHome(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#hero';
|
||||
}
|
||||
goToContactUs(){
|
||||
window.location.href = 'https://www.thrickodithanamscb.in/index.html#contact';
|
||||
}
|
||||
|
||||
goToView() {
|
||||
this.router.navigate(['/tender-view']);
|
||||
}
|
||||
|
||||
goToUpload(){
|
||||
this.router.navigate(['/tender-upload']);
|
||||
}
|
||||
|
||||
// public getUser(): Observable<User> {
|
||||
// return of({
|
||||
// email: localStorage.getItem('username'),
|
||||
// name: localStorage.getItem('username'),
|
||||
|
||||
// });
|
||||
// }
|
||||
|
||||
navigateTo(destination: any) {
|
||||
this.router.navigate([destination])
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
import { Directive, Input, Output, EventEmitter, SimpleChanges, ChangeDetectorRef } from '@angular/core';
|
||||
import { DecimalPipe } from '@angular/common';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 20-03-2020
|
||||
Created For : For Amount feilds decimal formatting.
|
||||
*/
|
||||
|
||||
@Directive({
|
||||
selector: '[ictAmount]',
|
||||
host: {
|
||||
'[value]': 'ictAmount',
|
||||
'(change)': 'change($event.target.value)',
|
||||
}
|
||||
})
|
||||
export class AmountDirective {
|
||||
|
||||
@Input() ictAmount: number;
|
||||
@Output() ictAmountChange: EventEmitter<string> = new EventEmitter<string>();
|
||||
|
||||
amtDecPts = 2;
|
||||
|
||||
constructor(
|
||||
private _cdr: ChangeDetectorRef,
|
||||
private _decimalPipe: DecimalPipe,
|
||||
) { }
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
this.format(this.ictAmount);
|
||||
}
|
||||
|
||||
change(value) {
|
||||
this.format(value, "C");
|
||||
}
|
||||
|
||||
format(value, flag?: string) {
|
||||
value = (value && value.toString()) ? (value.toString().replace(/,/gi, "")) : 0;
|
||||
let pattern = "1." + this.amtDecPts + "-" + this.amtDecPts;
|
||||
value = this._decimalPipe.transform(value, pattern);
|
||||
value = value.replace(/,/gi, "");
|
||||
// this.ictAmountChange.next(value);
|
||||
if (!flag || flag != "C")
|
||||
this._cdr.detectChanges();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
import { Directive, Input, Output, EventEmitter, ChangeDetectorRef, SimpleChanges } from '@angular/core';
|
||||
import { DecimalPipe } from '@angular/common';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 20-03-2020
|
||||
Created For : For Rate feilds decimal formatting.
|
||||
*/
|
||||
|
||||
@Directive({
|
||||
selector: '[ictCurrency]',
|
||||
host: {
|
||||
'[value]': 'ictCurrency',
|
||||
'(change)': 'change($event.target.value)',
|
||||
}
|
||||
})
|
||||
export class CurrencyDirective {
|
||||
|
||||
@Input() ictCurrency: number;
|
||||
@Output() ictCurrencyChange: EventEmitter<string> = new EventEmitter<string>();
|
||||
|
||||
coinDec = 2;
|
||||
|
||||
constructor(
|
||||
private _cdr: ChangeDetectorRef,
|
||||
private _decimalPipe: DecimalPipe
|
||||
) { }
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
this.format(this.ictCurrency);
|
||||
}
|
||||
|
||||
change(value) {
|
||||
this.format(value, "C");
|
||||
}
|
||||
|
||||
format(value, flag?: string) {
|
||||
value = (value && value.toString()) ? (value.toString().replace(/,/gi, "")) : 0;
|
||||
let coinDec = this.coinDec;
|
||||
let pattern = "1." + coinDec + "-" + coinDec;
|
||||
value = this._decimalPipe.transform(value, pattern);
|
||||
value = value.replace(/,/gi, "");
|
||||
// this.ictCurrencyChange.next(value);
|
||||
if (!flag || flag != "C")
|
||||
this._cdr.detectChanges();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
import { Directive, Input, Output, EventEmitter, SimpleChanges, ChangeDetectorRef } from '@angular/core';
|
||||
import { DecimalPipe } from '@angular/common';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 20-03-2020
|
||||
Created For : For Amount feilds decimal formatting.
|
||||
*/
|
||||
|
||||
@Directive({
|
||||
selector: '[ictFormat]',
|
||||
host: {
|
||||
'[value]': 'ictFormat',
|
||||
'(change)': 'change($event.target.value)',
|
||||
}
|
||||
})
|
||||
export class FormatDirective {
|
||||
|
||||
@Input() ictFormat: number;
|
||||
@Output() ictFormatChange: EventEmitter<string> = new EventEmitter<string>();
|
||||
@Input() arg: string;
|
||||
|
||||
constructor(
|
||||
private _cdr: ChangeDetectorRef,
|
||||
private _decimalPipe: DecimalPipe,
|
||||
) { }
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
console.log("===arg===", this.arg);
|
||||
this.format(this.ictFormat);
|
||||
}
|
||||
|
||||
change(value) {
|
||||
this.format(value, "C");
|
||||
}
|
||||
|
||||
format(value, flag?: string) {
|
||||
value = (value && value.toString()) ? (value.toString().replace(/,/gi, "")) : 0;
|
||||
// let pattern = "1." + this._icoService.currentCompanyDetails.amtDecPts + "-" + this._icoService.currentCompanyDetails.amtDecPts;
|
||||
let pattern = "1.2-2";
|
||||
value = this._decimalPipe.transform(value, pattern);
|
||||
value = value.replace(/,/gi, "");
|
||||
// this.ictFormatChange.next(value);
|
||||
if (!flag || flag != "C")
|
||||
this._cdr.detectChanges();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
import { Directive, ElementRef, HostListener } from '@angular/core';
|
||||
|
||||
/*
|
||||
created by Ajith A Pradeep
|
||||
created on 03/03/2023
|
||||
*/
|
||||
@Directive({
|
||||
selector: '[numberOnly]'
|
||||
})
|
||||
export class NumberOnlyDirective {
|
||||
|
||||
private regex: RegExp = new RegExp(/^\d*\.?\d{0,2}$/g);
|
||||
|
||||
constructor(private el: ElementRef) { }
|
||||
|
||||
// Listen for all keydown events on the input field
|
||||
@HostListener('keydown', ['$event'])
|
||||
onKeyDown(event: KeyboardEvent) {
|
||||
// Allow backspace, delete, and navigation keys (arrows)
|
||||
if ([46, 8, 9, 27, 13, 110, 190].indexOf(event.keyCode) !== -1 ||
|
||||
// Allow Ctrl/Cmd+A, Ctrl/Cmd+C, Ctrl/Cmd+X
|
||||
(event.keyCode === 65 || event.keyCode === 67 || event.keyCode === 88) && (event.ctrlKey || event.metaKey)) {
|
||||
return;
|
||||
}
|
||||
// Do not allow anything else that is not a number or decimal point
|
||||
if ((event.shiftKey || event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105) && event.keyCode !== 190 && event.keyCode !== 110) {
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
// Listen for all input events on the input field (copy-paste, drag-and-drop, etc.)
|
||||
@HostListener('input', ['$event']) onInputChange(event: any) {
|
||||
const initialValue = this.el.nativeElement.value;
|
||||
const newValue = initialValue.replace(/[^0-9\.]/g, ''); // Remove any character that isn't a number or decimal point
|
||||
const parts = newValue.split('.');
|
||||
if (parts.length > 1) {
|
||||
// Limit to two decimal places
|
||||
this.el.nativeElement.value = `${parts[0]}.${parts[1].substring(0, 2)}`;
|
||||
} else {
|
||||
this.el.nativeElement.value = parts[0];
|
||||
}
|
||||
if (initialValue !== this.el.nativeElement.value) {
|
||||
// Emit change event to update host component property
|
||||
event.stopPropagation();
|
||||
this.el.nativeElement.dispatchEvent(new Event('input'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
import { Directive, Input, Output, EventEmitter, ChangeDetectorRef, SimpleChanges } from '@angular/core';
|
||||
import { DecimalPipe } from '@angular/common';
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 20-03-2020
|
||||
Created For : For Rate feilds decimal formatting.
|
||||
*/
|
||||
|
||||
@Directive({
|
||||
selector: '[ictRate]',
|
||||
host: {
|
||||
'[value]': 'ictRate',
|
||||
'(change)': 'change($event.target.value)',
|
||||
}
|
||||
})
|
||||
export class RateDirective {
|
||||
|
||||
@Input() ictRate: number;
|
||||
@Output() ictRateChange: EventEmitter<string> = new EventEmitter<string>();
|
||||
|
||||
rateDecPts: number = 2;
|
||||
|
||||
constructor(
|
||||
private _cdr: ChangeDetectorRef,
|
||||
private _decimalPipe: DecimalPipe
|
||||
) { }
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
this.format(this.ictRate);
|
||||
}
|
||||
|
||||
change(value) {
|
||||
this.format(value, "C");
|
||||
}
|
||||
|
||||
format(value, flag?: string) {
|
||||
value = (value && value.toString()) ? (value.toString().replace(/,/gi, "")) : 0;
|
||||
let pattern = "1." + this.rateDecPts + "-" + this.rateDecPts;
|
||||
value = this._decimalPipe.transform(value, pattern);
|
||||
value = value.replace(/,/gi, "");
|
||||
// this.ictRateChange.next(value);
|
||||
if (!flag || flag != "C")
|
||||
this._cdr.detectChanges();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
export interface AppConfig {
|
||||
inputStyle?: string;
|
||||
dark?: boolean;
|
||||
theme?: string;
|
||||
ripple?: boolean;
|
||||
}
|
||||
@ -0,0 +1,4 @@
|
||||
// environmenter.token.ts
|
||||
import { InjectionToken, Inject } from '@angular/core';
|
||||
// That last string is just a description for debugging purpose
|
||||
export const ENVIRONMENTER = new InjectionToken('Environmenter');
|
||||
@ -0,0 +1,52 @@
|
||||
|
||||
|
||||
export const apiUrl = {
|
||||
login: "auth/signin",
|
||||
googleSignIn: "auth/google",
|
||||
facebookSignIn: "auth/facebook",
|
||||
userInfo: "auth/user-info",
|
||||
<<<<<<< HEAD
|
||||
getTender: "tender",
|
||||
=======
|
||||
getTender: "tender-details",
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
AllTenderData: "tender",
|
||||
TenderType: "tender-type",
|
||||
TenderCategory: "tender-category",
|
||||
PaymentMode: "payment-mode",
|
||||
formcontract: "form-of-contract",
|
||||
productcategory: "product-category",
|
||||
emdFeeType: "emd-fee-type",
|
||||
documentType: "document-type",
|
||||
drawingUploadDoc:"file-upload/drawings",
|
||||
<<<<<<< HEAD
|
||||
nitUploadDoc:"file-upload/notice",
|
||||
coverslov: "covers-lov",
|
||||
fileformatlov:"file-format-lov",
|
||||
=======
|
||||
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
docUpload: "file-upload/Bank-documents",
|
||||
|
||||
userImageUpload: "file-upload/user",
|
||||
changePassword: 'iuser/change-password',
|
||||
cryptoEncrypt: "crypto/encrypt",
|
||||
cryptoDecrypt: "crypto/decrypt",
|
||||
registerOtp: 'auth/otp/R',
|
||||
validateRegisterOtp: 'auth/verifyOtp/R',
|
||||
signup: 'auth/signup',
|
||||
<<<<<<< HEAD
|
||||
bankDocs: 'file-upload/Bank-Documents-Arc',
|
||||
drawingsDownloadDocs: "file-upload/Drawings-Arc",
|
||||
adminTenderView:'tender/admin'
|
||||
=======
|
||||
bankDocs: 'file-upload/Bank-Documents-Arc'
|
||||
>>>>>>> 7a8b1ea4654d5c265e964fc9b34b53f325c9cfb3
|
||||
|
||||
|
||||
};
|
||||
|
||||
export const apiFilterProperties = {
|
||||
|
||||
};
|
||||
@ -0,0 +1,7 @@
|
||||
|
||||
export const routePath = {
|
||||
home:"/auth/admin-home",
|
||||
login: "/auth/login",
|
||||
dashboard: "/dashboard",
|
||||
|
||||
};
|
||||
@ -0,0 +1,27 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Subject } from 'rxjs';
|
||||
import { AppConfig } from '../_domain/appconfig';
|
||||
|
||||
@Injectable()
|
||||
export class AppConfigService {
|
||||
|
||||
config: AppConfig = {
|
||||
theme: 'saga-blue',
|
||||
dark: false,
|
||||
inputStyle: 'outlined',
|
||||
ripple: true
|
||||
};
|
||||
|
||||
private configUpdate = new Subject<AppConfig>();
|
||||
|
||||
configUpdate$ = this.configUpdate.asObservable();
|
||||
|
||||
updateConfig(config: AppConfig) {
|
||||
this.config = config;
|
||||
this.configUpdate.next(config);
|
||||
}
|
||||
|
||||
getConfig() {
|
||||
return this.config;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,158 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
||||
import { Router } from '@angular/router';
|
||||
import { apiUrl } from '../_resources/api-url.properties';
|
||||
import { routePath } from '../_resources/route-path.properties';
|
||||
import { ProvidersService } from '../providers.service';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { map } from 'rxjs/operators';
|
||||
import { AuthenticationDto } from 'src/app/_dto/authentication.dto';
|
||||
import { TokenDto } from 'src/app/_dto/token.dto';
|
||||
|
||||
|
||||
/*
|
||||
Created By : Arun Joy
|
||||
Created On : 14-01-2020
|
||||
Created For : Created for getting authentication data from authentication API.
|
||||
*/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class AuthService {
|
||||
|
||||
headers: HttpHeaders = new HttpHeaders();
|
||||
|
||||
environment: any;
|
||||
firebaseToken: string = ''
|
||||
|
||||
currentUserShortInfo: { userId: string, userName: string, userImagePath: string } = { userId: '', userName: '', userImagePath: '' };
|
||||
private currentUserSubject: BehaviorSubject<any>;
|
||||
public currentUser: Observable<any>;
|
||||
|
||||
constructor(
|
||||
private http: HttpClient,
|
||||
private router: Router,
|
||||
private conn: ProvidersService
|
||||
) {
|
||||
this.environment = this.conn.environment;
|
||||
this.currentUserSubject = new BehaviorSubject<any>(localStorage.getItem('authtoken') ? true : false);
|
||||
this.currentUser = this.currentUserSubject.asObservable();
|
||||
}
|
||||
|
||||
public get currentUserValue(): any {
|
||||
return this.currentUserSubject.value;
|
||||
}
|
||||
|
||||
signIn(param: AuthenticationDto)
|
||||
: Promise<TokenDto> {
|
||||
this.headers.append('Content-Type', 'application/json');
|
||||
this.headers.append('emailid', param.username);
|
||||
return (this.http.post<TokenDto>(`${this.environment.apiUrl}/${apiUrl.login}`, param)
|
||||
.pipe(map(user => {
|
||||
console.log("=======user========", user)
|
||||
if (user && user != null) {
|
||||
console.log("=======user======1==", user)
|
||||
// if (user.accessToken)
|
||||
this.currentUserSubject.next(user);
|
||||
// else
|
||||
// return user;
|
||||
}
|
||||
return user;
|
||||
})))
|
||||
.toPromise();
|
||||
}
|
||||
|
||||
getUserModule(param: AuthenticationDto): Promise<void> {
|
||||
return this.http.get<any>(`${this.environment.apiUrl}/${apiUrl.login}`, { headers: { 'emailid': param.username } }).toPromise();
|
||||
}
|
||||
|
||||
getUserInfo(): Promise<{ userId: string, userName: string, userImagePath: string, userEmail: string, userMobile: string }> {
|
||||
return this.http.get<any>(`${this.environment.apiUrl}/${apiUrl.userInfo}`).toPromise();
|
||||
}
|
||||
|
||||
facebookSignIn() {
|
||||
var myWindow = window.open(`${this.environment.apiUrl}/${apiUrl.facebookSignIn}`, "_system", "width=400,height=400,toolbar=yes,scrollbars=yes,resizable=yes");
|
||||
// console.log("====my window", myWindow);
|
||||
|
||||
let timer = setInterval(() => {
|
||||
if (myWindow.closed) {
|
||||
clearInterval(timer);
|
||||
let token = localStorage.getItem("authtoken");
|
||||
if (token) {
|
||||
this.router.navigate([routePath.dashboard]);
|
||||
}
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
}
|
||||
|
||||
googleSignIn() {
|
||||
var myWindow = window.open(`${this.environment.apiUrl}/${apiUrl.googleSignIn}`, "_system", "width=400,height=400,toolbar=yes,scrollbars=yes,resizable=yes");
|
||||
// console.log("====my window", myWindow);
|
||||
|
||||
let timer = setInterval(() => {
|
||||
if (myWindow.closed) {
|
||||
clearInterval(timer);
|
||||
let token = localStorage.getItem("authtoken");
|
||||
if (token) {
|
||||
this.router.navigate([routePath.dashboard]);
|
||||
}
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
}
|
||||
|
||||
async logOut() {
|
||||
localStorage.setItem('authtoken', '');
|
||||
localStorage.setItem('refreshtoken', '');
|
||||
localStorage.setItem('emailId', '');
|
||||
localStorage.setItem('module', '');
|
||||
await localStorage.removeItem('authtoken');
|
||||
localStorage.removeItem('refreshtoken');
|
||||
localStorage.removeItem('emailId');
|
||||
localStorage.removeItem('module');
|
||||
localStorage.removeItem('passwordVersion');
|
||||
this.currentUserSubject.next(null);
|
||||
// await this.router.navigate([routePath.login]);
|
||||
// location.reload();
|
||||
// this.navCntrl.navigateBack('/Login');
|
||||
let institute = localStorage.getItem("institute");
|
||||
this.router.navigate([routePath.login]);
|
||||
}
|
||||
|
||||
|
||||
async getUserImage(imageName: string): Promise<any> {
|
||||
return this.http.get(`${this.environment.apiUrl}/${apiUrl.userImageUpload}/${imageName}`, { responseType: 'blob' }).toPromise();
|
||||
}
|
||||
|
||||
async changePassword(body, id?): Promise<any> {
|
||||
return await this.http.patch<any>(`${this.environment.apiUrl}/${"user/change-password"}`, body).toPromise();
|
||||
}
|
||||
|
||||
async patchToken(): Promise<any> {
|
||||
console.log(this.firebaseToken, 'firebase token');
|
||||
|
||||
return await this.http.patch<any>(`${this.environment.apiUrl}/${"user/firebase"}`, { token: this.firebaseToken }).toPromise();
|
||||
}
|
||||
|
||||
// async validatePassword(authCredentials:AuthenticationDto)
|
||||
// {
|
||||
// console.log("===validatePassword authCredentials====",authCredentials);
|
||||
// return this.http.get(`${this.environment.apiUrl}/${apiUrl.validatePassword}/${authCredentials}`).toPromise();
|
||||
// }
|
||||
|
||||
async sendOtp(email,FR): Promise<any> {
|
||||
console.log("==",email)
|
||||
return await this.http.post<any>(`${this.environment.apiUrl}/${"auth/otp"}/${FR}`,email).toPromise();
|
||||
}
|
||||
|
||||
async verifyOtp(body,FR): Promise<any> {
|
||||
return await this.http.post<any>(`${this.environment.apiUrl}/${"auth/verifyOtp"}/${FR}`,body).toPromise();
|
||||
}
|
||||
|
||||
async forgotPassword(body): Promise<any> {
|
||||
return await this.http.post<any>(`${this.environment.apiUrl}/${"auth/forgot-password"}`,body).toPromise();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ProvidersService } from '../providers.service';
|
||||
|
||||
|
||||
/**************************
|
||||
Created by Ajith A Pradeep
|
||||
Created on 21/03/2022
|
||||
**************************/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class ErrorTranslateService {
|
||||
|
||||
helpPrimaryData: any = {};
|
||||
helpSecondaryData: any = {};
|
||||
|
||||
environment: any;
|
||||
primaryLangauge: any="en";
|
||||
|
||||
constructor(
|
||||
private httpClient: HttpClient,
|
||||
private conn: ProvidersService
|
||||
) {
|
||||
this.environment = this.conn.environment;
|
||||
this.init();
|
||||
}
|
||||
|
||||
async init() {
|
||||
await this.getPrimarySecondryLangauge();
|
||||
}
|
||||
|
||||
async getPrimarySecondryLangauge(): Promise<void> {
|
||||
this.helpPrimaryData = await this.getErrorJsonData(this.primaryLangauge);
|
||||
}
|
||||
|
||||
translate(code: string): string {
|
||||
return this.first(code) ;
|
||||
}
|
||||
|
||||
first(code: string): string {
|
||||
switch (this.primaryLangauge) {
|
||||
case "": return;
|
||||
default:
|
||||
return this.helpPrimaryData[code] ? (this.helpPrimaryData[code]) : code;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private async getErrorJsonData(lang: string): Promise<any> {
|
||||
if (!lang || lang.trim() == "") return {};
|
||||
return await this.httpClient.get(`assets/i18n/error/${lang}.json`).toPromise();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,89 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { environment } from 'src/environments/environment';
|
||||
import { UiService } from './ui.service';
|
||||
|
||||
|
||||
/**************************
|
||||
Created by Ajith A Pradeep
|
||||
Created on 04/04/2022
|
||||
**************************/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class MasterService {
|
||||
|
||||
loading: boolean = false;
|
||||
|
||||
constructor(
|
||||
private http: HttpClient,
|
||||
private _uiService: UiService
|
||||
) { }
|
||||
|
||||
|
||||
|
||||
async getMasterData(apiUrl, filter?: string): Promise<any> {
|
||||
if (!filter)
|
||||
filter = ''
|
||||
return await this.http.get<any>(`${environment.apiUrl}/${apiUrl}${filter}`).toPromise();
|
||||
}
|
||||
|
||||
async getMasterDatabyId(apiUrl, id): Promise<any> {
|
||||
return await this.http.get<any>(`${environment.apiUrl}/${apiUrl}/${id}`).toPromise();
|
||||
}
|
||||
|
||||
async saveMasterData(apiUrl, body): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${apiUrl}`, body).toPromise();
|
||||
}
|
||||
|
||||
async saveAllMasterData(apiUrl, body): Promise<any[]> {
|
||||
return await this.http.post<any[]>(`${environment.apiUrl}/${apiUrl}`, body).toPromise();
|
||||
}
|
||||
|
||||
async postMasterData(apiUrl, body, id): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${apiUrl}/${id}`, body).toPromise();
|
||||
}
|
||||
|
||||
async updateMasterData(apiUrl, body, id): Promise<any> {
|
||||
return await this.http.put<any>(`${environment.apiUrl}/${apiUrl}/${id}`, body).toPromise();
|
||||
}
|
||||
|
||||
async deleteMasterData(apiUrl, id): Promise<any[]> {
|
||||
return await this.http.delete<any>(`${environment.apiUrl}/${apiUrl}/${id}`).toPromise();
|
||||
}
|
||||
|
||||
async saveImage(apiUrl, body): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${apiUrl}`, body).toPromise();
|
||||
}
|
||||
|
||||
async getImg(apiUrlEnd: string, imagePath: string) {
|
||||
return await this.http.get(`${environment.apiUrl}/${apiUrlEnd}/${imagePath}`, { responseType: 'blob' }).toPromise();
|
||||
}
|
||||
|
||||
async getJsonData(name: string): Promise<any> {
|
||||
if (!name || name.trim() == "") return {};
|
||||
return await this.http.get(`assets/i18n/json/${name}.json`).toPromise();
|
||||
}
|
||||
|
||||
|
||||
async getLovDataFormat(endUrl, filterCondition?) {
|
||||
let data = []
|
||||
this.loading = true;
|
||||
let filter = ''
|
||||
if (filterCondition) {
|
||||
filter = filterCondition
|
||||
}
|
||||
await this.getMasterData(endUrl, filter).then((res: any[]) => {
|
||||
data = res;
|
||||
this.loading = false;
|
||||
},
|
||||
err => {
|
||||
this.loading = false;
|
||||
console.log("----err----", err);
|
||||
this._uiService.toastMessage(err.error.message, 5000, true);
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
/**************************
|
||||
Created by Ajith A Pradeep
|
||||
Created on 02/04/2022
|
||||
**************************/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class MenuService {
|
||||
|
||||
menuData: any;
|
||||
|
||||
favouriteMenuData: any;
|
||||
|
||||
public isShowSidebar: boolean;
|
||||
|
||||
constructor(
|
||||
private httpClient: HttpClient
|
||||
) { }
|
||||
|
||||
async getJsonData(name: string): Promise<any> {
|
||||
if (!name || name.trim() == "") return {};
|
||||
return await this.httpClient.get(`assets/i18n/json/${name}.json`).toPromise();
|
||||
}
|
||||
|
||||
async getMenuData(apiUrl, filter?): Promise<any> {
|
||||
if (!filter)
|
||||
filter = ''
|
||||
return await this.httpClient.get(`${environment.apiUrl}/${apiUrl}${filter}`).toPromise();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { IgissueDetailDto } from 'src/app/_dto/igissue-detail.dto';
|
||||
import { IgissueSummaryDto } from 'src/app/_dto/igissue-summary.dto';
|
||||
import { environment } from 'src/environments/environment';
|
||||
import { apiUrl } from '../_resources/api-url.properties';
|
||||
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class SupportService {
|
||||
|
||||
constructor(private http: HttpClient,
|
||||
) { }
|
||||
|
||||
async getMasterData(apiEndUrl: string, filter?: string): Promise<IgissueSummaryDto[]> {
|
||||
return await this.http.get<IgissueSummaryDto[]>(`${environment.apiUrl}/${apiEndUrl}`).toPromise();
|
||||
}
|
||||
|
||||
async save(body: any): Promise<IgissueSummaryDto> {
|
||||
return await this.http.post<IgissueSummaryDto>(`${environment.apiUrl}/${apiUrl.issueTracker}`, body).toPromise();
|
||||
}
|
||||
|
||||
|
||||
async getDetailMasterData(apiEndUrl: string, filter?: string): Promise<IgissueDetailDto[]> {
|
||||
return await this.http.get<IgissueDetailDto[]>(`${environment.apiUrl}/${apiEndUrl}/${filter}`).toPromise();
|
||||
}
|
||||
|
||||
async updateMasterData(apiEndurl: string, body: any): Promise<IgissueSummaryDto> {
|
||||
return await this.http.post<IgissueSummaryDto>(`${environment.apiUrl}/${apiEndurl}`, body).toPromise();
|
||||
}
|
||||
|
||||
async updateDetailData(apiEndUrl: string, body): Promise<IgissueDetailDto> {
|
||||
return await this.http.post<IgissueDetailDto>(`${environment.apiUrl}/${apiEndUrl}`, body).toPromise();
|
||||
}
|
||||
|
||||
async getImg(apiUrlEnd: string, imagePath: string) {
|
||||
return await this.http.get(`${environment.apiUrl}/${apiUrlEnd}/${imagePath}`, { responseType: 'blob' }).toPromise();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
import { DatePipe } from '@angular/common';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { environment } from 'src/environments/environment';
|
||||
import { apiUrl } from '../_resources/api-url.properties';
|
||||
|
||||
/**************************
|
||||
Created by Ajith A Pradeep
|
||||
Created on 07/05/2022
|
||||
**************************/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class TransactionService {
|
||||
|
||||
constructor(
|
||||
private http: HttpClient,
|
||||
private _datePipe:DatePipe
|
||||
) { }
|
||||
|
||||
dateFormatting(dateValue) {
|
||||
let inputDate = new Date(dateValue)
|
||||
let today = new Date()
|
||||
let formattedDate
|
||||
if (inputDate < today && this._datePipe.transform(inputDate, 'dd/MM/yyyy') != this._datePipe.transform(today, 'dd/MM/yyyy')) {
|
||||
formattedDate = this._datePipe.transform(new Date(inputDate), 'yyyy/MM/dd') + " 23:59:59"
|
||||
}
|
||||
else if (inputDate > today && this._datePipe.transform(inputDate, 'dd/MM/yyyy') != this._datePipe.transform(today, 'dd/MM/yyyy')) {
|
||||
formattedDate = this._datePipe.transform(new Date(inputDate), 'yyyy/MM/dd') + " 00:00:01"
|
||||
}
|
||||
else {
|
||||
formattedDate = this._datePipe.transform(new Date(), 'yyyy/MM/dd HH:mm:ss')
|
||||
}
|
||||
return formattedDate
|
||||
}
|
||||
|
||||
async getTransactionData(apiUrl, filter?: string): Promise<any> {
|
||||
if (!filter)
|
||||
filter = ''
|
||||
return await this.http.get<any>(`${environment.apiUrl}/${apiUrl}${filter}`).toPromise();
|
||||
}
|
||||
|
||||
async getTransactionDatabyId(apiUrl, id): Promise<any> {
|
||||
return await this.http.get<any>(`${environment.apiUrl}/${apiUrl}/${id}`).toPromise();
|
||||
}
|
||||
|
||||
async saveTransactionData(apiUrl, body): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${apiUrl}`, body).toPromise();
|
||||
}
|
||||
|
||||
async updateTransactionData(apiUrl, body, id): Promise<any> {
|
||||
return await this.http.put<any>(`${environment.apiUrl}/${apiUrl}/${id}`, body).toPromise();
|
||||
}
|
||||
|
||||
async deleteTransactionData(apiUrl, id): Promise<any[]> {
|
||||
return await this.http.delete<any>(`${environment.apiUrl}/${apiUrl}/${id}`).toPromise();
|
||||
}
|
||||
|
||||
|
||||
async encryptedCode(code): Promise<any> {
|
||||
return await this.http.post<any[]>(`${environment.apiUrl}/${apiUrl.cryptoEncrypt}`, { data: code }).toPromise();
|
||||
}
|
||||
|
||||
async decryptedCode(code): Promise<any> {
|
||||
return await this.http.post<any[]>(`${environment.apiUrl}/${apiUrl.cryptoDecrypt}`, { data: code }).toPromise();
|
||||
}
|
||||
|
||||
async sendOtp(email, FR): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${"sms-api/otp"}/${FR}`, email).toPromise();
|
||||
}
|
||||
|
||||
async verifyOtp(body, FR): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${"sms-api/verifyOtp"}/${FR}`, body).toPromise();
|
||||
}
|
||||
|
||||
async saveMultipleData(apiUrl, body): Promise<any[]> {
|
||||
return await this.http.post<any[]>(`${environment.apiUrl}/${apiUrl}`, body).toPromise();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,150 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { environment } from 'src/environments/environment';
|
||||
import { apiUrl } from '../_resources/api-url.properties';
|
||||
import { ToWords } from 'to-words';
|
||||
import { AuthService } from './auth.service';
|
||||
import { ErrorTranslateService } from './error-translate.service';
|
||||
|
||||
/**************************
|
||||
Created by Ajith A Pradeep
|
||||
Created on 21/03/2022
|
||||
**************************/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class UiService {
|
||||
|
||||
isCapitalized: boolean = true;
|
||||
|
||||
toWords = new ToWords({
|
||||
localeCode: 'en-IN',
|
||||
converterOptions: {
|
||||
currency: true,
|
||||
ignoreDecimal: false,
|
||||
ignoreZeroCurrency: false,
|
||||
doNotAddOnly: false,
|
||||
}
|
||||
});
|
||||
|
||||
numberToWords = new ToWords();
|
||||
|
||||
constructor(
|
||||
public _snackBar: MatSnackBar,
|
||||
private http: HttpClient,
|
||||
private authService: AuthService,
|
||||
private _errorTranslateService: ErrorTranslateService
|
||||
) {
|
||||
|
||||
}
|
||||
|
||||
parseDate(dateString: string): Date {
|
||||
if (dateString) {
|
||||
return new Date(dateString);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
toastMessage(message: string, timeDuration?: number, error?: boolean, green?: boolean, button?: string) {
|
||||
let defaultButton = "Close";
|
||||
let defaultTime = 3000;
|
||||
if (button && button != null)
|
||||
defaultButton = button;
|
||||
if (timeDuration && timeDuration != null)
|
||||
defaultTime = timeDuration
|
||||
if (error)
|
||||
this._snackBar.open(message, defaultButton, { duration: defaultTime, panelClass: ['mat-toolbar', 'mat-warn'] });
|
||||
else
|
||||
this._snackBar.open(message, defaultButton, { duration: defaultTime });
|
||||
if (error && green)
|
||||
this._snackBar.open(message, defaultButton, { duration: defaultTime });
|
||||
if (green)
|
||||
this._snackBar.open(message, defaultButton, { duration: defaultTime, panelClass: ['custom-green-snackbar'] });
|
||||
else
|
||||
this._snackBar.open(message, defaultButton, { duration: defaultTime });
|
||||
|
||||
}
|
||||
|
||||
|
||||
openSnackBar(message: string, action: string) {
|
||||
this._snackBar.open(message, action);
|
||||
}
|
||||
|
||||
admissionNoValidation(number) {
|
||||
let regex = new RegExp(/^\d{4}$/i)
|
||||
return regex.test(number)
|
||||
}
|
||||
|
||||
phoneNoValidation(number) {
|
||||
let regex = new RegExp(/^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[6789]\d{9}$/);
|
||||
return regex.test(number)
|
||||
}
|
||||
|
||||
emailValidation(email) {
|
||||
let regex = new RegExp(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/);
|
||||
return regex.test(email)
|
||||
}
|
||||
|
||||
alphabetsOnlyValidation(stringValue) {
|
||||
let regex = new RegExp(/^[a-zA-Z ]*$/);
|
||||
return regex.test(stringValue);
|
||||
}
|
||||
|
||||
async getUserInfo(body): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${apiUrl.userInfo}`, body).toPromise();
|
||||
}
|
||||
|
||||
getInstitution() {
|
||||
let institution = {
|
||||
name: '',
|
||||
logo: '',
|
||||
fullName: ''
|
||||
}
|
||||
|
||||
institution.name = localStorage.getItem('institute');
|
||||
if (institution.name) {
|
||||
switch (institution.name) {
|
||||
case 'salesapp':
|
||||
institution.logo = "./../../../../../assets/accurate/images/salesapp.jpg";
|
||||
break;
|
||||
case 'dav':
|
||||
institution.logo = "./../../../../../assets/accurate/images/dav.png";
|
||||
break;
|
||||
default:
|
||||
institution.logo = './../../../../../assets/accurate/images/institute.png';
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
institution.logo = './../../../../../assets/accurate/images/institute.png';
|
||||
}
|
||||
|
||||
return institution;
|
||||
}
|
||||
|
||||
async userValidation() {
|
||||
// await this.getUserInfo().then((res) => {
|
||||
|
||||
// }, (err) => {
|
||||
// console.log("err==", err);
|
||||
// this.toastMessage((err.error.message) ? err.error.message : this._errorTranslateService.translate('errorInApi'));
|
||||
// });
|
||||
}
|
||||
|
||||
async capitalizeInputs() {
|
||||
|
||||
if (this.isCapitalized) {
|
||||
let inputs = document.querySelectorAll(".capitalise");
|
||||
inputs.forEach(item => {
|
||||
item.addEventListener("input", this.capitalize, true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
capitalize(e) {
|
||||
e.target.value = e.target.value.toUpperCase();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { environment } from 'src/environments/environment';
|
||||
|
||||
|
||||
/**************************
|
||||
Created by Abhijith
|
||||
Created on 06/05/2022
|
||||
**************************/
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class ValidationService {
|
||||
|
||||
constructor(
|
||||
private http: HttpClient
|
||||
) { }
|
||||
|
||||
async validateFormNo(apiUrl, formNo): Promise<any> {
|
||||
return await this.http.post<any>(`${environment.apiUrl}/${apiUrl}`, { formNo: formNo }).toPromise();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'lib-providers',
|
||||
template: `
|
||||
<p>
|
||||
providers works!
|
||||
</p>
|
||||
`,
|
||||
styles: [
|
||||
]
|
||||
})
|
||||
export class ProvidersComponent implements OnInit {
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue