├── src ├── assets │ ├── .gitkeep │ └── images │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── laptop-2.png │ │ └── laptop-three.png ├── app │ ├── app.component.scss │ ├── app.component.html │ ├── modules │ │ ├── project-manager │ │ │ ├── components │ │ │ │ ├── all-projects │ │ │ │ │ ├── all-projects.component.html │ │ │ │ │ ├── all-projects.component.scss │ │ │ │ │ ├── all-projects.component.ts │ │ │ │ │ └── all-projects.component.spec.ts │ │ │ │ ├── project-manager-dashboard │ │ │ │ │ ├── project-manager-dashboard.component.scss │ │ │ │ │ ├── project-manager-dashboard.component.html │ │ │ │ │ ├── project-manager-dashboard.component.ts │ │ │ │ │ └── project-manager-dashboard.component.spec.ts │ │ │ │ ├── nav-bar │ │ │ │ │ ├── nav-bar.component.scss │ │ │ │ │ ├── nav-bar.component.ts │ │ │ │ │ ├── nav-bar.component.spec.ts │ │ │ │ │ └── nav-bar.component.html │ │ │ │ ├── user-details │ │ │ │ │ ├── user-details.component.scss │ │ │ │ │ ├── user-details.component.spec.ts │ │ │ │ │ ├── user-details.component.ts │ │ │ │ │ └── user-details.component.html │ │ │ │ ├── projectManager.service.spec.ts │ │ │ │ ├── edit-project │ │ │ │ │ ├── edit-project.component.scss │ │ │ │ │ ├── edit-project.component.spec.ts │ │ │ │ │ ├── edit-project.component.ts │ │ │ │ │ └── edit-project.component.html │ │ │ │ ├── user-position │ │ │ │ │ ├── user-position.component.scss │ │ │ │ │ ├── user-position.component.spec.ts │ │ │ │ │ ├── user-position.component.html │ │ │ │ │ └── user-position.component.ts │ │ │ │ ├── project-data.model.ts │ │ │ │ ├── project-details │ │ │ │ │ ├── project-details.component.ts │ │ │ │ │ ├── project-details.component.spec.ts │ │ │ │ │ ├── project-details.component.scss │ │ │ │ │ └── project-details.component.html │ │ │ │ ├── all-users │ │ │ │ │ ├── all-users.component.spec.ts │ │ │ │ │ ├── all-users.component.scss │ │ │ │ │ ├── all-users.component.ts │ │ │ │ │ └── all-users.component.html │ │ │ │ ├── create-project │ │ │ │ │ ├── create-project.component.spec.ts │ │ │ │ │ ├── create-project.component.scss │ │ │ │ │ ├── create-project.component.ts │ │ │ │ │ └── create-project.component.html │ │ │ │ ├── home │ │ │ │ │ ├── home.component.scss │ │ │ │ │ ├── home.component.spec.ts │ │ │ │ │ ├── home.component.ts │ │ │ │ │ └── home.component.html │ │ │ │ └── projectManager.service.ts │ │ │ ├── project-manager-routing.module.ts │ │ │ └── project-manager.module.ts │ │ ├── developer │ │ │ ├── components │ │ │ │ ├── developer-dashboard │ │ │ │ │ ├── developer-dashboard.component.scss │ │ │ │ │ ├── developer-dashboard.component.html │ │ │ │ │ ├── developer-dashboard.component.ts │ │ │ │ │ └── developer-dashboard.component.spec.ts │ │ │ │ ├── dev-nav-bar │ │ │ │ │ ├── dev-nav-bar.component.scss │ │ │ │ │ ├── dev-nav-bar.component.ts │ │ │ │ │ ├── dev-nav-bar.component.html │ │ │ │ │ └── dev-nav-bar.component.spec.ts │ │ │ │ ├── dev-home │ │ │ │ │ ├── dev-home.component.scss │ │ │ │ │ ├── dev-home.component.spec.ts │ │ │ │ │ ├── dev-home.component.ts │ │ │ │ │ └── dev-home.component.html │ │ │ │ ├── dev-projectData.model.ts │ │ │ │ ├── project-works │ │ │ │ │ ├── project-works.component.scss │ │ │ │ │ ├── project-works.component.spec.ts │ │ │ │ │ ├── project-works.component.ts │ │ │ │ │ └── project-works.component.html │ │ │ │ ├── dev-project-details │ │ │ │ │ ├── dev-project-details.component.scss │ │ │ │ │ ├── dev-project-details.component.ts │ │ │ │ │ ├── dev-project-details.component.spec.ts │ │ │ │ │ └── dev-project-details.component.html │ │ │ │ ├── upload-project │ │ │ │ │ ├── upload-project.component.spec.ts │ │ │ │ │ ├── upload-project.component.scss │ │ │ │ │ ├── upload-project.component.ts │ │ │ │ │ └── upload-project.component.html │ │ │ │ └── developer.service.ts │ │ │ ├── developer-routing.module.ts │ │ │ └── developer.module.ts │ │ └── submitter │ │ │ ├── components │ │ │ ├── submitter-dashboard │ │ │ │ ├── submitter-dashboard.component.scss │ │ │ │ ├── submitter-dashboard.component.html │ │ │ │ ├── submitter-dashboard.component.ts │ │ │ │ └── submitter-dashboard.component.spec.ts │ │ │ ├── sub-nav │ │ │ │ ├── sub-nav.component.scss │ │ │ │ ├── sub-nav.component.ts │ │ │ │ ├── sub-nav.component.html │ │ │ │ └── sub-nav.component.spec.ts │ │ │ ├── submitter.service.ts │ │ │ ├── sub-home │ │ │ │ ├── sub-home.component.scss │ │ │ │ ├── sub-home.component.spec.ts │ │ │ │ ├── sub-home.component.ts │ │ │ │ └── sub-home.component.html │ │ │ ├── sub-project-details │ │ │ │ ├── sub-project-details.component.ts │ │ │ │ ├── sub-project-details.component.spec.ts │ │ │ │ ├── sub-project-details.component.scss │ │ │ │ └── sub-project-details.component.html │ │ │ ├── list-bug │ │ │ │ ├── list-bug.component.spec.ts │ │ │ │ ├── list-bug.component.ts │ │ │ │ ├── list-bug.component.scss │ │ │ │ └── list-bug.component.html │ │ │ └── report-bug │ │ │ │ ├── report-bug.component.spec.ts │ │ │ │ ├── report-bug.component.scss │ │ │ │ ├── report-bug.component.ts │ │ │ │ └── report-bug.component.html │ │ │ ├── submitter-routing.module.ts │ │ │ └── submitter.module.ts │ ├── app.component.ts │ ├── auth │ │ ├── auth-data.model.ts │ │ ├── auth.service.spec.ts │ │ ├── landing-page │ │ │ ├── landing-page.component.ts │ │ │ ├── landing-page.component.spec.ts │ │ │ ├── landing-page.component.scss │ │ │ └── landing-page.component.html │ │ ├── auth-interceptor.ts │ │ ├── login │ │ │ ├── login.component.spec.ts │ │ │ ├── login.component.ts │ │ │ ├── login.component.html │ │ │ └── login.component.scss │ │ ├── register │ │ │ ├── register.component.spec.ts │ │ │ ├── register.component.ts │ │ │ ├── register.component.html │ │ │ └── register.component.scss │ │ ├── utils │ │ │ └── validation.ts │ │ └── auth.service.ts │ ├── has-role.guard.ts │ ├── app-routing.module.ts │ ├── app.component.spec.ts │ ├── app.module.ts │ └── angular-material.module.ts ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── main.ts ├── styles.scss ├── index.html ├── test.ts └── polyfills.ts ├── .vscode ├── settings.json ├── extensions.json ├── launch.json └── tasks.json ├── .editorconfig ├── Backend ├── middleware │ └── check-auth.js ├── models │ ├── user.js │ └── project-model.js ├── routes │ ├── developer.js │ ├── project-Manager.js │ └── user.js └── app.js ├── tsconfig.app.json ├── tsconfig.spec.json ├── .browserslistrc ├── .gitignore ├── tsconfig.json ├── README.md ├── server.js ├── karma.conf.js ├── package.json └── angular.json /src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "liveServer.settings.port": 5501 3 | } -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-projects/all-projects.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-projects/all-projects.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/developer-dashboard/developer-dashboard.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/submitter-dashboard/submitter-dashboard.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-manager-dashboard/project-manager-dashboard.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/favicon.ico -------------------------------------------------------------------------------- /src/app/modules/submitter/components/submitter-dashboard/submitter-dashboard.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/developer-dashboard/developer-dashboard.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/1.png -------------------------------------------------------------------------------- /src/assets/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/2.png -------------------------------------------------------------------------------- /src/assets/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/3.png -------------------------------------------------------------------------------- /src/assets/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/4.png -------------------------------------------------------------------------------- /src/assets/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/5.png -------------------------------------------------------------------------------- /src/assets/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/6.png -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-manager-dashboard/project-manager-dashboard.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/images/laptop-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/laptop-2.png -------------------------------------------------------------------------------- /src/assets/images/laptop-three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jaffer-Ali-Abubakker/Project-Management-Software/HEAD/src/assets/images/laptop-three.png -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 3 | "recommendations": ["angular.ng-template"] 4 | } 5 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.scss'] 7 | }) 8 | export class AppComponent { 9 | title = 'Project-Management'; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-nav/sub-nav.component.scss: -------------------------------------------------------------------------------- 1 | .sidenav-container { 2 | height: 100%; 3 | } 4 | 5 | .sidenav { 6 | width: 200px; 7 | } 8 | 9 | .sidenav .mat-toolbar { 10 | background: inherit; 11 | } 12 | 13 | .mat-toolbar.mat-primary { 14 | position: sticky; 15 | top: 0; 16 | z-index: 1; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/nav-bar/nav-bar.component.scss: -------------------------------------------------------------------------------- 1 | .sidenav-container { 2 | height: 100%; 3 | } 4 | 5 | .sidenav { 6 | width: 200px; 7 | } 8 | 9 | .sidenav .mat-toolbar { 10 | background: inherit; 11 | } 12 | 13 | .mat-toolbar.mat-primary { 14 | position: sticky; 15 | top: 0; 16 | z-index: 1; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-nav-bar/dev-nav-bar.component.scss: -------------------------------------------------------------------------------- 1 | .sidenav-container { 2 | height: 100%; 3 | } 4 | 5 | .sidenav { 6 | width: 200px; 7 | } 8 | 9 | .sidenav .mat-toolbar { 10 | background: inherit; 11 | } 12 | 13 | .mat-toolbar.mat-primary { 14 | position: sticky; 15 | top: 0; 16 | z-index: 1; 17 | } 18 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /Backend/middleware/check-auth.js: -------------------------------------------------------------------------------- 1 | const jwt = require("jsonwebtoken"); 2 | 3 | module.exports = (req, res, next)=>{ 4 | try { 5 | const token = req.header.authorization.split(" ")[1]; 6 | jwt.verify(token,"secret_this_should_be_longer") 7 | next() 8 | } catch (error){ 9 | res.status(401).json({message: "Auth failed !"}); 10 | } 11 | }; -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-details/user-details.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-3 { 2 | height: 550px; 3 | margin-top: 50px; 4 | } 5 | table{ 6 | width: 100%; 7 | margin-top: 20px; 8 | } 9 | .mat-card-2{ 10 | height: 60px; 11 | background-color: #3f51b5; 12 | width: 70%; 13 | margin-top: -30px; 14 | margin-left: -30px; 15 | } 16 | h2{ 17 | color: white; 18 | } -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/submitter.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from "@angular/common/http"; 3 | 4 | @Injectable({ 5 | providedIn: 'root' 6 | }) 7 | export class SubmitterService { 8 | 9 | constructor(private http: HttpClient) { } 10 | 11 | ReportBug(projectTitle: string,projectName: string,projectType: string,noOfBugs:number){ 12 | 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /src/app/auth/auth-data.model.ts: -------------------------------------------------------------------------------- 1 | export interface AuthData { 2 | FullName: string; 3 | email: string; 4 | mobile: number; 5 | password: string; 6 | 7 | } 8 | export interface AuthDataLogin { 9 | email: string; 10 | password: string; 11 | } 12 | export interface AuthDataTable { 13 | FullName: string; 14 | email: string; 15 | mobile: number; 16 | password: string; 17 | position: string; 18 | } 19 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-projects/all-projects.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-all-projects', 5 | templateUrl: './all-projects.component.html', 6 | styleUrls: ['./all-projects.component.scss'] 7 | }) 8 | export class AllProjectsComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/auth/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { AuthService } from './auth.service'; 4 | 5 | describe('AuthService', () => { 6 | let service: AuthService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(AuthService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/developer-dashboard/developer-dashboard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-developer-dashboard', 5 | templateUrl: './developer-dashboard.component.html', 6 | styleUrls: ['./developer-dashboard.component.scss'] 7 | }) 8 | export class DeveloperDashboardComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/submitter-dashboard/submitter-dashboard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-submitter-dashboard', 5 | templateUrl: './submitter-dashboard.component.html', 6 | styleUrls: ['./submitter-dashboard.component.scss'] 7 | }) 8 | export class SubmitterDashboardComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/projectManager.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | import { AuthService } from './projectManager.service'; 4 | 5 | describe('AuthService', () => { 6 | let service: AuthService; 7 | 8 | beforeEach(() => { 9 | TestBed.configureTestingModule({}); 10 | service = TestBed.inject(AuthService); 11 | }); 12 | 13 | it('should be created', () => { 14 | expect(service).toBeTruthy(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-home/dev-home.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1{ 2 | height: 300px; 3 | margin-top: 30px; 4 | margin-left: 30px; 5 | width: 70%; 6 | 7 | } 8 | .mat-card-2{ 9 | margin-top: 30px; 10 | width: 90%; 11 | height: 300px; 12 | } 13 | .mat-card-1-5{ 14 | width: 60%; 15 | margin-top: -30px; 16 | margin-left: -20px; 17 | height: 50px; 18 | background-color: #3f51b5; 19 | } 20 | .head-1{ 21 | margin-top: -7px; 22 | color: white; 23 | } 24 | table{ 25 | width: 100%; 26 | } -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-manager-dashboard/project-manager-dashboard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-project-manager-dashboard', 5 | templateUrl: './project-manager-dashboard.component.html', 6 | styleUrls: ['./project-manager-dashboard.component.scss'] 7 | }) 8 | export class ProjectManagerDashboardComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/auth/landing-page/landing-page.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { faArrowCircleRight } from '@fortawesome/free-solid-svg-icons'; 3 | 4 | @Component({ 5 | selector: 'app-landing-page', 6 | templateUrl: './landing-page.component.html', 7 | styleUrls: ['./landing-page.component.scss'] 8 | }) 9 | export class LandingPageComponent implements OnInit { 10 | faArrowCircleRight = faArrowCircleRight; 11 | 12 | constructor() { } 13 | 14 | ngOnInit(): void { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/app/has-role.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, UrlTree } from '@angular/router'; 3 | import { Observable } from 'rxjs'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | export class HasRoleGuard implements CanActivate { 9 | canActivate( 10 | route: ActivatedRouteSnapshot, 11 | state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { 12 | return true; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/edit-project/edit-project.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1{ 2 | background-color: #3f51b5; 3 | max-width: 300px; 4 | height: 50px; 5 | margin-top: -20px; 6 | margin-left: -20px; 7 | } 8 | .mat-dialog-content{ 9 | margin-top: 20px; 10 | } 11 | .head-1{ 12 | margin-top: -7px; 13 | font-weight: 500; 14 | color: white; 15 | font-size: 20px; 16 | } 17 | .button-1{ 18 | margin-left: 70px; 19 | margin-top: -20px; 20 | 21 | } 22 | .link-1{ 23 | margin: auto; 24 | } -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-position/user-position.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-4{ 2 | width: 180px; 3 | margin-left: 230px; 4 | margin-top: -70px; 5 | height: 70px; 6 | background-color: #3f51b5; 7 | } 8 | .mat-card-2{ 9 | width: 450px; 10 | height: 150px; 11 | } 12 | .p-tag1{ 13 | color: white; 14 | margin-left: 40px; 15 | font-size: 20px; 16 | } 17 | .p-tag2{ 18 | margin-left: 15px; 19 | margin-top: -10px; 20 | color: white; 21 | } 22 | .btn-1{ 23 | margin-top: 10px; 24 | } -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-home/sub-home.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1{ 2 | height: 300px; 3 | margin-top: 30px; 4 | margin-left: 30px; 5 | width: 70%; 6 | 7 | } 8 | .mat-card-2{ 9 | margin-top: 30px; 10 | width: 90%; 11 | height: 300px; 12 | } 13 | .mat-card-1-5{ 14 | width: 60%; 15 | margin-top: -30px; 16 | margin-left: -20px; 17 | height: 50px; 18 | background-color: #3f51b5; 19 | } 20 | .head-1{ 21 | margin-top: -7px; 22 | color: white; 23 | } 24 | table{ 25 | width: 100%; 26 | } -------------------------------------------------------------------------------- /Backend/models/user.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose") 2 | const uniqueValidator = require("mongoose-unique-validator") 3 | 4 | const userSchema = mongoose.Schema({ 5 | FullName : {type : String, required: true}, 6 | email : { type: String, required: true, unique: true}, 7 | mobile : { type: Number, required: true, unique: true}, 8 | password : { type: String, required: true}, 9 | position : { type: String } 10 | }); 11 | 12 | userSchema.plugin(uniqueValidator); 13 | 14 | module.exports = mongoose.model("User", userSchema); -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "name": "ng serve", 7 | "type": "pwa-chrome", 8 | "request": "launch", 9 | "preLaunchTask": "npm: start", 10 | "url": "http://localhost:4200/" 11 | }, 12 | { 13 | "name": "ng test", 14 | "type": "chrome", 15 | "request": "launch", 16 | "preLaunchTask": "npm: test", 17 | "url": "http://localhost:9876/debug.html" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-projectData.model.ts: -------------------------------------------------------------------------------- 1 | export interface getprojectData{ 2 | projectTitle: string 3 | projectName: string; 4 | projectType: string; 5 | created: string; 6 | deadLine: string; 7 | features: string; 8 | Developer: string; 9 | submitter: string; 10 | } 11 | export interface updateprojectface{ 12 | projectTitle: string 13 | projectName: string; 14 | ProjectStatus: string; 15 | } 16 | export interface UploadProjectInter{ 17 | projectTitle: string 18 | projectName: string; 19 | comments: string; 20 | GitRepo: string 21 | } -------------------------------------------------------------------------------- /src/app/modules/developer/components/project-works/project-works.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1{ 2 | margin-top: 70px; 3 | height: 400px; 4 | margin-left: 30px; 5 | 6 | } 7 | 8 | .mat-card-1-5{ 9 | width: 300px; 10 | height: 50px; 11 | margin-top: -30px; 12 | margin-left: -20px; 13 | background-color: #3f51b5; 14 | } 15 | 16 | .head-1{ 17 | color: white; 18 | margin-top: -10px; 19 | font-size: large; 20 | } 21 | .form-one{ 22 | margin-top: 20px; 23 | } 24 | 25 | .btn-1{ 26 | margin-left: 200px; 27 | } 28 | .row-upload{ 29 | margin-top: 20px; 30 | } 31 | .row-button{ 32 | margin-top: 20px; 33 | } 34 | -------------------------------------------------------------------------------- /src/app/auth/auth-interceptor.ts: -------------------------------------------------------------------------------- 1 | import { HttpHandler, HttpInterceptor, HttpRequest } from "@angular/common/http"; 2 | import { Injectable } from "@angular/core"; 3 | import { AuthService } from "./auth.service"; 4 | 5 | @Injectable() 6 | export class AuthInterceptor implements HttpInterceptor { 7 | constructor(private authService: AuthService){ } 8 | intercept(req: HttpRequest, next: HttpHandler) { 9 | const authToken = this.authService.getToken(); 10 | const authRequest = req.clone({ 11 | headers: req.headers.set('Authorization', "Bearer" + authToken) 12 | }); 13 | return next.handle(authRequest) 14 | 15 | } 16 | } -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-project-details/dev-project-details.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1{ 2 | width: 60%; 3 | height: 50px; 4 | background-color: #3f51b5; 5 | margin-top: -20px; 6 | margin-left: -20px; 7 | } 8 | .head-1{ 9 | color: white; 10 | margin-top: -10px; 11 | } 12 | .para{ 13 | margin-left: 20px; 14 | color: blue; 15 | margin-top: -15px; 16 | 17 | } 18 | .para-0{ 19 | font-size: small; 20 | } 21 | .mat-card-2{ 22 | margin-top: 20px; 23 | } 24 | .sub-head-2{ 25 | margin-top: 20px; 26 | } 27 | .sub-head-1{ 28 | margin-top: 20px; 29 | } 30 | .sub-head-3{ 31 | margin-top: 20px; 32 | } -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-data.model.ts: -------------------------------------------------------------------------------- 1 | export interface projectData { 2 | projectTitle: string 3 | projectName: string; 4 | projectType: string; 5 | created: string; 6 | deadLine: string; 7 | features: string; 8 | Developer: string; 9 | submitter: string; 10 | } 11 | export interface getprojectData{ 12 | id: string 13 | projectTitle: string 14 | projectName: string; 15 | projectType: string; 16 | created: string; 17 | deadLine: string; 18 | features: string; 19 | Developer: string; 20 | submitter: string; 21 | } 22 | export interface userData{ 23 | position: string; 24 | 25 | } -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | last 1 Chrome version 12 | last 1 Firefox version 13 | last 2 Edge major versions 14 | last 2 Safari major versions 15 | last 2 iOS major versions 16 | Firefox ESR 17 | -------------------------------------------------------------------------------- /Backend/models/project-model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const projectData = mongoose.Schema({ 4 | projectTitle: { type: String, required: true }, 5 | projectName: { type: String, required: true }, 6 | projectType: { type: String, required: true }, 7 | created: { type: String, required: true }, 8 | deadLine: { type: String, required: true }, 9 | features: { type: String, required: true }, 10 | Developer: { type: String, required: true }, 11 | submitter: { type: String, required: true }, 12 | Status: { type: String}, 13 | comments: {type: String}, 14 | GitRep: {type: String} 15 | }); 16 | 17 | module.exports = mongoose.model("Created-projects", projectData); 18 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-project-details/dev-project-details.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-dev-project-details', 6 | templateUrl: './dev-project-details.component.html', 7 | styleUrls: ['./dev-project-details.component.scss'] 8 | }) 9 | export class DevProjectDetailsComponent implements OnInit { 10 | project: any = [] 11 | 12 | constructor( @Inject(MAT_DIALOG_DATA) public ProjectData: any) { } 13 | 14 | ngOnInit(): void { 15 | let result = this.ProjectData 16 | this.project.push(result) 17 | console.log(this.project); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/auth/login/login.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LoginComponent } from './login.component'; 4 | 5 | describe('LoginComponent', () => { 6 | let component: LoginComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ LoginComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(LoginComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-details/project-details.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-project-details', 6 | templateUrl: './project-details.component.html', 7 | styleUrls: ['./project-details.component.scss'] 8 | }) 9 | export class ProjectDetailsComponent implements OnInit { 10 | project: any = [] 11 | 12 | constructor( @Inject(MAT_DIALOG_DATA) public ProjectData: any) { } 13 | 14 | ngOnInit(): void { 15 | let result = this.ProjectData 16 | this.project.push(result) 17 | console.log(this.project); 18 | 19 | } 20 | 21 | } 22 | 23 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-project-details/sub-project-details.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | 4 | 5 | @Component({ 6 | selector: 'app-sub-project-details', 7 | templateUrl: './sub-project-details.component.html', 8 | styleUrls: ['./sub-project-details.component.scss'] 9 | }) 10 | export class SubProjectDetailsComponent implements OnInit { 11 | 12 | project: any[] = [] 13 | 14 | constructor(@Inject(MAT_DIALOG_DATA) public ProjectData: any) { } 15 | 16 | ngOnInit(): void { 17 | let result = this.ProjectData 18 | this.project.push(result) 19 | console.log(this.project); 20 | 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | 3 | // Font Awesome 4 | @import "~@fortawesome/fontawesome-free/scss/fontawesome.scss"; 5 | @import "~@fortawesome/fontawesome-free/scss/solid.scss"; 6 | @import "~@fortawesome/fontawesome-free/scss/regular.scss"; 7 | @import "~@fortawesome/fontawesome-free/scss/brands.scss"; 8 | 9 | 10 | // MDB SCSS 11 | @import url("https://fonts.googleapis.com/icon?family=Material+Icons"); 12 | @import "~mdb-angular-ui-kit/assets/scss/mdb.scss"; 13 | 14 | html, body { height: 100%; } 15 | body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } 16 | 17 | /* You can add global styles to this file, and also import other style files */ 18 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-nav/sub-nav.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; 3 | import { Observable } from 'rxjs'; 4 | import { map, shareReplay } from 'rxjs/operators'; 5 | 6 | @Component({ 7 | selector: 'app-sub-nav', 8 | templateUrl: './sub-nav.component.html', 9 | styleUrls: ['./sub-nav.component.scss'] 10 | }) 11 | export class SubNavComponent { 12 | 13 | isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) 14 | .pipe( 15 | map(result => result.matches), 16 | shareReplay() 17 | ); 18 | 19 | constructor(private breakpointObserver: BreakpointObserver) {} 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/plugins/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /src/app/auth/register/register.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { RegisterComponent } from './register.component'; 4 | 5 | describe('RegisterComponent', () => { 6 | let component: RegisterComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ RegisterComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(RegisterComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # Compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | /bazel-out 8 | 9 | # Node 10 | .env 11 | /node_modules 12 | npm-debug.log 13 | yarn-error.log 14 | 15 | # IDEs and editors 16 | .idea/ 17 | .project 18 | .classpath 19 | .c9/ 20 | *.launch 21 | .settings/ 22 | *.sublime-workspace 23 | 24 | # Visual Studio Code 25 | .vscode/* 26 | !.vscode/settings.json 27 | !.vscode/tasks.json 28 | !.vscode/launch.json 29 | !.vscode/extensions.json 30 | .history/* 31 | 32 | # Miscellaneous 33 | /.angular/cache 34 | .sass-cache/ 35 | /connect.lock 36 | /coverage 37 | /libpeerconnection.log 38 | testem.log 39 | /typings 40 | 41 | # System files 42 | .DS_Store 43 | Thumbs.db 44 | -------------------------------------------------------------------------------- /src/app/auth/utils/validation.ts: -------------------------------------------------------------------------------- 1 | import { AbstractControl, ValidatorFn } from '@angular/forms'; 2 | 3 | export default class Validation { 4 | static match(controlName: string, checkControlName: string): ValidatorFn { 5 | return (controls: AbstractControl) => { 6 | const control = controls.get(controlName); 7 | const checkControl = controls.get(checkControlName); 8 | 9 | if (checkControl?.errors && !checkControl.errors['matching']) { 10 | return null; 11 | } 12 | 13 | if (control?.value !== checkControl?.value) { 14 | controls.get(checkControlName)?.setErrors({ matching: true }); 15 | return { matching: true }; 16 | } else { 17 | return null; 18 | } 19 | }; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-home/dev-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DevHomeComponent } from './dev-home.component'; 4 | 5 | describe('DevHomeComponent', () => { 6 | let component: DevHomeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ DevHomeComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(DevHomeComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/list-bug/list-bug.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ListBugComponent } from './list-bug.component'; 4 | 5 | describe('ListBugComponent', () => { 6 | let component: ListBugComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ListBugComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ListBugComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-home/sub-home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SubHomeComponent } from './sub-home.component'; 4 | 5 | describe('SubHomeComponent', () => { 6 | let component: SubHomeComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ SubHomeComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(SubHomeComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/auth/landing-page/landing-page.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LandingPageComponent } from './landing-page.component'; 4 | 5 | describe('LandingPageComponent', () => { 6 | let component: LandingPageComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ LandingPageComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(LandingPageComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ProjectManagement 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-users/all-users.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AllUsersComponent } from './all-users.component'; 4 | 5 | describe('AllUsersComponent', () => { 6 | let component: AllUsersComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ AllUsersComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(AllUsersComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/list-bug/list-bug.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, VERSION } from '@angular/core'; 2 | import { FormBuilder, FormGroup, FormControl } from "@angular/forms"; 3 | 4 | 5 | 6 | @Component({ 7 | selector: 'app-list-bug', 8 | templateUrl: './list-bug.component.html', 9 | styleUrls: ['./list-bug.component.scss'] 10 | }) 11 | export class ListBugComponent implements OnInit { 12 | public BugListForm!: FormGroup 13 | BugList: any[] = [] 14 | constructor(private formBuilder: FormBuilder) { } 15 | 16 | ngOnInit(): void { 17 | this.BugListForm = this.formBuilder.group({ 18 | BugTitle:[''], 19 | BugDetail:[''] 20 | }) 21 | } 22 | BulistSubmit(){ 23 | this.BugList = this.BugListForm.value; 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/report-bug/report-bug.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ReportBugComponent } from './report-bug.component'; 4 | 5 | describe('ReportBugComponent', () => { 6 | let component: ReportBugComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ReportBugComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ReportBugComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-projects/all-projects.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AllProjectsComponent } from './all-projects.component'; 4 | 5 | describe('AllProjectsComponent', () => { 6 | let component: AllProjectsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ AllProjectsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(AllProjectsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/edit-project/edit-project.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EditProjectComponent } from './edit-project.component'; 4 | 5 | describe('EditProjectComponent', () => { 6 | let component: EditProjectComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ EditProjectComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(EditProjectComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-details/user-details.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { UserDetailsComponent } from './user-details.component'; 4 | 5 | describe('UserDetailsComponent', () => { 6 | let component: UserDetailsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ UserDetailsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(UserDetailsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/project-works/project-works.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ProjectWorksComponent } from './project-works.component'; 4 | 5 | describe('ProjectWorksComponent', () => { 6 | let component: ProjectWorksComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ProjectWorksComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ProjectWorksComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-position/user-position.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { UserPositionComponent } from './user-position.component'; 4 | 5 | describe('UserPositionComponent', () => { 6 | let component: UserPositionComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ UserPositionComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(UserPositionComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/upload-project/upload-project.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { UploadProjectComponent } from './upload-project.component'; 4 | 5 | describe('UploadProjectComponent', () => { 6 | let component: UploadProjectComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ UploadProjectComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(UploadProjectComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/create-project/create-project.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CreateProjectComponent } from './create-project.component'; 4 | 5 | describe('CreateProjectComponent', () => { 6 | let component: CreateProjectComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ CreateProjectComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(CreateProjectComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-users/all-users.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1 { 2 | width: 450px; 3 | height: 400px; 4 | margin-top: 50px; 5 | background-color: #3f51b5; 6 | border-radius: 20px; 7 | } 8 | .mat-card-2{ 9 | height: 100px; 10 | margin-top: 50px; 11 | width: 450px; 12 | 13 | } 14 | 15 | 16 | table { 17 | width: 100%; 18 | } 19 | .example-margin-2{ 20 | margin-left: 30px; 21 | } 22 | button{ 23 | margin-top: 20px; 24 | margin-left:400px; 25 | } 26 | .icon-one { 27 | zoom: 80%; 28 | background-color: #3f51b5; 29 | color: white; 30 | } 31 | #b{ 32 | margin-left: 10px; 33 | } 34 | .mat-card-4{ 35 | width: 200px; 36 | height: 70px; 37 | margin-left: 230px; 38 | margin-top: -80px; 39 | background-color: #3f51b5; 40 | } -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-details/project-details.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ProjectDetailsComponent } from './project-details.component'; 4 | 5 | describe('ProjectDetailsComponent', () => { 6 | let component: ProjectDetailsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ProjectDetailsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ProjectDetailsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-project-details/dev-project-details.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DevProjectDetailsComponent } from './dev-project-details.component'; 4 | 5 | describe('DevProjectDetailsComponent', () => { 6 | let component: DevProjectDetailsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ DevProjectDetailsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(DevProjectDetailsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-project-details/sub-project-details.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SubProjectDetailsComponent } from './sub-project-details.component'; 4 | 5 | describe('SubProjectDetailsComponent', () => { 6 | let component: SubProjectDetailsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ SubProjectDetailsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(SubProjectDetailsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-nav-bar/dev-nav-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; 3 | import { Observable } from 'rxjs'; 4 | import { map, shareReplay } from 'rxjs/operators'; 5 | import { faDashboard} from "@fortawesome/free-solid-svg-icons"; 6 | 7 | @Component({ 8 | selector: 'app-dev-nav-bar', 9 | templateUrl: './dev-nav-bar.component.html', 10 | styleUrls: ['./dev-nav-bar.component.scss'] 11 | }) 12 | export class DevNavBarComponent { 13 | faDashboard = faDashboard; 14 | 15 | isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) 16 | .pipe( 17 | map(result => result.matches), 18 | shareReplay() 19 | ); 20 | 21 | constructor(private breakpointObserver: BreakpointObserver) {} 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: { 11 | context(path: string, deep?: boolean, filter?: RegExp): { 12 | (id: string): T; 13 | keys(): string[]; 14 | }; 15 | }; 16 | 17 | // First, initialize the Angular testing environment. 18 | getTestBed().initTestEnvironment( 19 | BrowserDynamicTestingModule, 20 | platformBrowserDynamicTesting(), 21 | ); 22 | 23 | // Then we find all the tests. 24 | const context = require.context('./', true, /\.spec\.ts$/); 25 | // And load the modules. 26 | context.keys().forEach(context); 27 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/developer-dashboard/developer-dashboard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DeveloperDashboardComponent } from './developer-dashboard.component'; 4 | 5 | describe('DeveloperDashboardComponent', () => { 6 | let component: DeveloperDashboardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ DeveloperDashboardComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(DeveloperDashboardComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/submitter-dashboard/submitter-dashboard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { SubmitterDashboardComponent } from './submitter-dashboard.component'; 4 | 5 | describe('SubmitterDashboardComponent', () => { 6 | let component: SubmitterDashboardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ SubmitterDashboardComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(SubmitterDashboardComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/report-bug/report-bug.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1{ 2 | max-width: 700px; 3 | height: 640px; 4 | margin: auto; 5 | margin-top: 30PX; 6 | } 7 | .mat-card-2{ 8 | background-color: #3f51b5; 9 | margin-top: -25px; 10 | margin-left: -10px; 11 | width: 60%; 12 | height: 40px; 13 | } 14 | .head-1{ 15 | color: white; 16 | margin-top: -12px; 17 | } 18 | .row-field-1{ 19 | margin-top: 20px; 20 | } 21 | .mat-form-2{ 22 | width: 50%; 23 | margin-left: 10px; 24 | } 25 | .row-field-2{ 26 | margin-top: 50px; 27 | } 28 | .mat-card-3{ 29 | height: 250px; 30 | background-color: #c1c4d3; 31 | border-radius: 20px; 32 | width: 90%; 33 | margin-left: 40px; 34 | } 35 | 36 | .btn-2{ 37 | margin-left: 500px; 38 | margin-top: 20px; 39 | } 40 | .icon-1{ 41 | margin-left: 10px; 42 | } -------------------------------------------------------------------------------- /src/app/modules/developer/components/upload-project/upload-project.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-2{ 2 | margin-top: 70px; 3 | height: 400px; 4 | width: 700px; 5 | margin-left: 90px; 6 | } 7 | .mat-card-2-5{ 8 | width: 600px; 9 | height: 50px; 10 | margin-top: -30px; 11 | margin-left: -20px; 12 | background-color: #3f51b5; 13 | } 14 | .mat-card-upload{ 15 | width: 400px; 16 | margin-left: 120px; 17 | height: 100px; 18 | } 19 | .row-upload-2{ 20 | margin-top: 30px; 21 | } 22 | .textarea{ 23 | width: 100%; 24 | } 25 | .row-upload-3{ 26 | margin-top: 30px; 27 | } 28 | .mat-form-field-one{ 29 | width: 80%; 30 | } 31 | .mat-form-field-two{ 32 | width: 100%; 33 | } 34 | .btn-2{ 35 | margin-left: 170px; 36 | } 37 | .row-upload{ 38 | margin-top: 20px; 39 | } 40 | .head-1{ 41 | color: white; 42 | margin-top: -10px; 43 | font-size: large; 44 | } -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-manager-dashboard/project-manager-dashboard.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ProjectManagerDashboardComponent } from './project-manager-dashboard.component'; 4 | 5 | describe('ProjectManagerDashboardComponent', () => { 6 | let component: ProjectManagerDashboardComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ProjectManagerDashboardComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ProjectManagerDashboardComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/create-project/create-project.component.scss: -------------------------------------------------------------------------------- 1 | 2 | @import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@600&family=Dongle&family=Open+Sans:wght@300;400&family=Righteous&family=Sarabun&display=swap'); 3 | 4 | .create-card { 5 | max-width: 70%; 6 | height: 500px; 7 | margin: auto; 8 | margin: 100px; 9 | } 10 | .create-card-1 { 11 | height: 70px; 12 | margin-top: -40px; 13 | background-color: #3f51b5; 14 | } 15 | .para-1{ 16 | margin-top: -20px; 17 | margin-left: 20px; 18 | font-size: small; 19 | color: white; 20 | } 21 | .head-1{ 22 | font-family: 'Open Sans', sans-serif; 23 | color: white; 24 | font-weight: 800; 25 | } 26 | 27 | button{ 28 | margin-left: 100px; 29 | padding-left: 50px; 30 | padding-right: 50px; 31 | 32 | } 33 | .btn-1{ 34 | margin-left: 500px; 35 | margin-top: -70px; 36 | } -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-project-details/sub-project-details.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1{ 2 | background-color: #3f51b5; 3 | height: 50px; 4 | width: 60%; 5 | margin-top: -20px; 6 | margin-left: -20px; 7 | } 8 | .head-1{ 9 | color: white; 10 | margin-top: -7px; 11 | } 12 | .head-2{ 13 | font-weight: 900; 14 | margin-top: 20px; 15 | } 16 | .para-1{ 17 | margin-left: 40px; 18 | margin-top: -15px; 19 | color: #3f51b5; 20 | } 21 | .mat-card-2{ 22 | margin-top: 20px; 23 | height: 100PX; 24 | 25 | } 26 | .line-1{ 27 | margin-top: 20px; 28 | } 29 | .head-3{ 30 | font-weight: 900; 31 | } 32 | .para-2{ 33 | margin-left: 40px; 34 | margin-top: -15px; 35 | color: #3f51b5; 36 | } 37 | mat-form-field{ 38 | margin-top: 30px; 39 | margin-left: 70px; 40 | width: 70%; 41 | } 42 | .head-4{ 43 | font-weight: 900; 44 | margin-top: -10px; 45 | } -------------------------------------------------------------------------------- /Backend/routes/developer.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const ProjectData = require('../models/project-model') 4 | 5 | 6 | router.post("/updateProjectStatus", async(req, res, next)=>{ 7 | let name = req.body.projectTitle 8 | ProjectData.updateOne({projectTitle:name},{ 9 | $set:{ 10 | Status: req.body.ProjectStatus 11 | } 12 | }).then((result)=>{ 13 | console.log(result); 14 | res.status(200).json(result) 15 | }) 16 | }) 17 | router.put('/UploadProject', async(req,res, next)=>{ 18 | let project = req.body.projectTitle 19 | ProjectData.updateOne({projectTitle:project},{ 20 | $set:{ 21 | comments: req.body.comments, 22 | GitRep: req.body.GitRepo 23 | } 24 | }).then((result)=>{ 25 | console.log(result); 26 | res.status(200).json(result) 27 | }) 28 | }) 29 | 30 | 31 | module.exports = router; -------------------------------------------------------------------------------- /src/app/modules/submitter/submitter-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { ReportBugComponent } from './components/report-bug/report-bug.component'; 4 | import { SubHomeComponent } from './components/sub-home/sub-home.component'; 5 | import { SubmitterDashboardComponent } from './components/submitter-dashboard/submitter-dashboard.component'; 6 | 7 | const routes: Routes = [ 8 | { 9 | path: '', 10 | component: SubmitterDashboardComponent, 11 | children: [ 12 | { path: 'home', component: SubHomeComponent }, 13 | { path: 'ReportBug', component: ReportBugComponent}, 14 | { path: '', redirectTo: '/submitter/home', pathMatch: 'full' }, 15 | ], 16 | }, 17 | ]; 18 | 19 | @NgModule({ 20 | imports: [RouterModule.forChild(routes)], 21 | exports: [RouterModule], 22 | }) 23 | export class SubmitterRoutingModule {} 24 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/nav-bar/nav-bar.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; 3 | import { Observable } from 'rxjs'; 4 | import { map, shareReplay } from 'rxjs/operators'; 5 | import { faDashboard, faTable, faUsers,faCreditCard } from "@fortawesome/free-solid-svg-icons"; 6 | 7 | @Component({ 8 | selector: 'app-nav-bar', 9 | templateUrl: './nav-bar.component.html', 10 | styleUrls: ['./nav-bar.component.scss'] 11 | }) 12 | export class NavBarComponent { 13 | faDashboard = faDashboard 14 | faTable = faTable; 15 | faUsers = faUsers; 16 | faCreditCard = faCreditCard; 17 | 18 | isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) 19 | .pipe( 20 | map(result => result.matches), 21 | shareReplay() 22 | ); 23 | 24 | constructor(private breakpointObserver: BreakpointObserver) {} 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-position/user-position.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | Select me 6 | Select the User position 7 | 8 | Developer 9 | Submiter 10 | 11 | 12 | 13 | 14 |
15 |

{{name.FullName}}

16 | 17 |

{{name.email}}

18 |
19 |
20 | 21 |
22 |
-------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "noImplicitOverride": true, 10 | "noPropertyAccessFromIndexSignature": true, 11 | "noImplicitReturns": true, 12 | "noFallthroughCasesInSwitch": true, 13 | "sourceMap": true, 14 | "declaration": false, 15 | "downlevelIteration": true, 16 | "experimentalDecorators": true, 17 | "moduleResolution": "node", 18 | "importHelpers": true, 19 | "target": "es2020", 20 | "module": "es2020", 21 | "lib": [ 22 | "es2020", 23 | "dom" 24 | ] 25 | }, 26 | "angularCompilerOptions": { 27 | "enableI18nLegacyMessageIdFormat": false, 28 | "strictInjectionParameters": true, 29 | "strictInputAccessModifiers": true, 30 | "strictTemplates": true 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/list-bug/list-bug.component.scss: -------------------------------------------------------------------------------- 1 | .row-field-3{ 2 | margin-top: 40px; 3 | } 4 | .vl { 5 | border-left: 3px solid #3f51b5; 6 | height: 230px; 7 | position: absolute; 8 | left: 45%; 9 | margin-left: -3px; 10 | top: 10px; 11 | } 12 | .head-2{ 13 | margin-left: 30px; 14 | margin-top: 50px; 15 | font-weight: 800; 16 | text-decoration: underline; 17 | } 18 | .mat-form-3{ 19 | margin-left: 20px; 20 | margin-top: -10px; 21 | color: rgb(10, 10, 10); 22 | border-color: aliceblue; 23 | } 24 | .head-3{ 25 | font-weight: 800; 26 | text-decoration: underline; 27 | } 28 | .mat-card-4{ 29 | margin-top: -10px; 30 | height: 150px; 31 | } 32 | .mat-form-4{ 33 | width: 100%; 34 | 35 | } 36 | .btn-1{ 37 | zoom: 70%; 38 | margin-left: 300px; 39 | margin-top: 20px; 40 | } 41 | .mat-card-3{ 42 | height: 250px; 43 | background-color: #c1c4d3; 44 | border-radius: 20px; 45 | width: 90%; 46 | margin-left: 40px; 47 | } -------------------------------------------------------------------------------- /src/app/modules/developer/developer-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { DevHomeComponent } from './components/dev-home/dev-home.component'; 4 | import { DevProjectDetailsComponent } from './components/dev-project-details/dev-project-details.component'; 5 | import { DeveloperDashboardComponent } from './components/developer-dashboard/developer-dashboard.component'; 6 | import { ProjectWorksComponent } from './components/project-works/project-works.component'; 7 | 8 | const routes: Routes = [ 9 | {path: '', component: DeveloperDashboardComponent, 10 | 11 | children:[ 12 | 13 | {path:'home', component: DevHomeComponent}, 14 | {path: 'projectDetails', component: DevProjectDetailsComponent}, 15 | {path: 'projectWork', component: ProjectWorksComponent}, 16 | {path:'',redirectTo:'/developer/home', pathMatch:'full'}, 17 | ], 18 | }, 19 | ]; 20 | 21 | @NgModule({ 22 | imports: [RouterModule.forChild(routes)], 23 | exports: [RouterModule] 24 | }) 25 | export class DeveloperRoutingModule { } 26 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 3 | "version": "2.0.0", 4 | "tasks": [ 5 | { 6 | "type": "npm", 7 | "script": "start", 8 | "isBackground": true, 9 | "problemMatcher": { 10 | "owner": "typescript", 11 | "pattern": "$tsc", 12 | "background": { 13 | "activeOnStart": true, 14 | "beginsPattern": { 15 | "regexp": "(.*?)" 16 | }, 17 | "endsPattern": { 18 | "regexp": "bundle generation complete" 19 | } 20 | } 21 | } 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "test", 26 | "isBackground": true, 27 | "problemMatcher": { 28 | "owner": "typescript", 29 | "pattern": "$tsc", 30 | "background": { 31 | "activeOnStart": true, 32 | "beginsPattern": { 33 | "regexp": "(.*?)" 34 | }, 35 | "endsPattern": { 36 | "regexp": "bundle generation complete" 37 | } 38 | } 39 | } 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /src/app/auth/login/login.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormBuilder, Validators, FormGroup } from "@angular/forms"; 3 | import { AuthService } from '../auth.service'; 4 | import { faGoogle, faFacebook } from '@fortawesome/free-brands-svg-icons'; 5 | 6 | 7 | 8 | @Component({ 9 | selector: 'app-login', 10 | templateUrl: './login.component.html', 11 | styleUrls: ['./login.component.scss'] 12 | }) 13 | export class LoginComponent implements OnInit { 14 | faGoogle =faGoogle; 15 | faFacebook = faFacebook; 16 | 17 | public loginForm! : FormGroup 18 | isAuthenticated = false; 19 | 20 | constructor(private formBuilder: FormBuilder, public authService: AuthService) { } 21 | 22 | ngOnInit(): void { 23 | this.loginForm = this.formBuilder.group({ 24 | email: ['', [Validators.required, Validators.email]], 25 | password: ['', Validators.required] 26 | }) 27 | } 28 | 29 | UserSubmit(){ 30 | if(this.loginForm.invalid){ 31 | return 32 | } 33 | 34 | this.authService.login(this.loginForm.value.email, this.loginForm.value.password); 35 | } 36 | 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/report-bug/report-bug.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormBuilder, FormGroup, FormControl } from "@angular/forms"; 3 | import { SubmitterService } from "../submitter.service"; 4 | @Component({ 5 | selector: 'app-report-bug', 6 | templateUrl: './report-bug.component.html', 7 | styleUrls: ['./report-bug.component.scss'] 8 | }) 9 | export class ReportBugComponent implements OnInit { 10 | public BugSubmitForm! : FormGroup 11 | constructor(private formBuilder: FormBuilder, private submitterService: SubmitterService ) { } 12 | 13 | ngOnInit(): void { 14 | this.BugSubmitForm = this.formBuilder.group({ 15 | projectTitle:[''], 16 | projectName:[''], 17 | projectType:[''], 18 | noOfBugs:[''] 19 | }) 20 | } 21 | BugSubmit(){ 22 | if(this.BugSubmitForm.invalid){ 23 | return 24 | } 25 | this.submitterService.ReportBug(this.BugSubmitForm.value.projectTitle, 26 | this.BugSubmitForm.value.projectName, 27 | this.BugSubmitForm.value.projectType, 28 | this.BugSubmitForm.value.noOfBugs 29 | ) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ProjectManagement 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.2. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. 24 | 25 | ## Further help 26 | 27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. 28 | -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { LoginComponent } from './auth/login/login.component'; 4 | import { RegisterComponent } from './auth/register/register.component'; 5 | import { LandingPageComponent } from './auth/landing-page/landing-page.component'; 6 | 7 | 8 | 9 | 10 | const routes: Routes = [ 11 | {path: "", component: LandingPageComponent}, 12 | {path: "login", component: LoginComponent}, 13 | {path: "register", component: RegisterComponent}, 14 | {path: "",redirectTo: "/", pathMatch:'full' }, 15 | {path: "developer", loadChildren: () => import('./modules/developer/developer.module').then((m)=> m.DeveloperModule),}, 16 | {path: "project-manager", loadChildren: () => import('./modules/project-manager/project-manager.module').then((m)=> m.ProjectManagerModule),}, 17 | {path: "submitter", loadChildren: () => import('./modules/submitter/submitter.module').then((m)=> m.SubmitterModule),}, 18 | 19 | 20 | 21 | ]; 22 | 23 | @NgModule({ 24 | imports: [RouterModule.forRoot(routes)], 25 | exports: [RouterModule] 26 | }) 27 | export class AppRoutingModule { } 28 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-nav/sub-nav.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | Menu 7 | 8 | dashboardDashboard 9 | errorReport Bug 10 | 11 | 12 | 13 | 14 | 15 | 23 | Submitter 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | 5 | describe('AppComponent', () => { 6 | beforeEach(async () => { 7 | await TestBed.configureTestingModule({ 8 | imports: [ 9 | RouterTestingModule 10 | ], 11 | declarations: [ 12 | AppComponent 13 | ], 14 | }).compileComponents(); 15 | }); 16 | 17 | it('should create the app', () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.componentInstance; 20 | expect(app).toBeTruthy(); 21 | }); 22 | 23 | it(`should have as title 'Project-Management'`, () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | const app = fixture.componentInstance; 26 | expect(app.title).toEqual('Project-Management'); 27 | }); 28 | 29 | it('should render title', () => { 30 | const fixture = TestBed.createComponent(AppComponent); 31 | fixture.detectChanges(); 32 | const compiled = fixture.nativeElement as HTMLElement; 33 | expect(compiled.querySelector('.content span')?.textContent).toContain('Project-Management app is running!'); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-details/project-details.component.scss: -------------------------------------------------------------------------------- 1 | .mat-card-1 { 2 | max-width: 700px; 3 | margin: auto; 4 | margin-top: 30px; 5 | height: 410px; 6 | } 7 | .mat-card-2{ 8 | margin-top: 20px; 9 | height: 170px; 10 | } 11 | .C-date{ 12 | margin-top: 20px; 13 | } 14 | .bar-1{ 15 | margin-top: 20px; 16 | } 17 | .projectTitle{ 18 | margin-top: -15px; 19 | margin-left: 20px; 20 | color: #3f51b5; 21 | } 22 | .projectName{ 23 | margin-top: -15px; 24 | margin-left: 20px; 25 | color: #3f51b5; 26 | } 27 | .submitter{ 28 | margin-top: -15px; 29 | margin-left: 20px; 30 | color: #3f51b5; 31 | } 32 | .projectType{ 33 | margin-top: -15px; 34 | margin-left: 20px; 35 | color: #3f51b5; 36 | } 37 | .Developer{ 38 | margin-top: -15px; 39 | margin-left: 20px; 40 | color: #3f51b5; 41 | } 42 | .created{ 43 | margin-top: -15px; 44 | margin-left: 20px; 45 | color: #3f51b5; 46 | } 47 | .deadLine{ 48 | margin-top: -15px; 49 | margin-left: 20px; 50 | color: #3f51b5; 51 | } 52 | .mat-card-main{ 53 | background-color: #3f51b5; 54 | height: 50px; 55 | width: 400px; 56 | } 57 | .head-1{ 58 | color: white; 59 | margin-top: -5px; 60 | font-weight: 800; 61 | } -------------------------------------------------------------------------------- /src/app/modules/submitter/components/list-bug/list-bug.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
7 |
8 |

Bug Title

9 | 10 | LIST ONE BY ONE 11 | 12 | 13 |
14 |
15 |

Details about the bug

16 | 17 | 18 | Textarea 19 | 20 | 21 | 22 | 25 |
26 |
27 |
28 |
29 |
30 |
31 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-nav-bar/dev-nav-bar.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | Menu 7 | 8 | dashboardDashboard 9 | assignmentProject Works 10 | Link 2 11 | Link 3 12 | 13 | 14 | 15 | 16 | 24 | Developer 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const app = require("./backend/app"); 2 | const debug = require("debug")("node-angular"); 3 | const http = require("http"); 4 | 5 | const normalizePort = val => { 6 | var port = parseInt(val, 10); 7 | 8 | if (isNaN(port)) { 9 | // named pipe 10 | return val; 11 | } 12 | 13 | if (port >= 0) { 14 | // port number 15 | return port; 16 | } 17 | 18 | return false; 19 | }; 20 | 21 | const onError = error => { 22 | if (error.syscall !== "listen") { 23 | throw error; 24 | } 25 | const bind = typeof port === "string" ? "pipe " + port : "port " + port; 26 | switch (error.code) { 27 | case "EACCES": 28 | console.error(bind + " requires elevated privileges"); 29 | process.exit(1); 30 | break; 31 | case "EADDRINUSE": 32 | console.error(bind + " is already in use"); 33 | process.exit(1); 34 | break; 35 | default: 36 | throw error; 37 | } 38 | }; 39 | 40 | const onListening = () => { 41 | const addr = server.address(); 42 | const bind = typeof port === "string" ? "pipe " + port : "port " + port; 43 | debug("Listening on " + bind); 44 | }; 45 | 46 | const port = normalizePort(process.env.PORT || "3000"); 47 | app.set("port", port); 48 | 49 | const server = http.createServer(app); 50 | server.on("error", onError); 51 | server.on("listening", onListening); 52 | server.listen(port); 53 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/upload-project/upload-project.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormControl, FormGroup, Validator,FormBuilder, Validators } from "@angular/forms"; 3 | import { DeveloperService } from '../developer.service'; 4 | 5 | @Component({ 6 | selector: 'app-upload-project', 7 | templateUrl: './upload-project.component.html', 8 | styleUrls: ['./upload-project.component.scss'] 9 | }) 10 | export class UploadProjectComponent implements OnInit { 11 | public UploadProject! : FormGroup 12 | 13 | constructor( 14 | private formBuilder: FormBuilder, 15 | private DeveloperService: DeveloperService, 16 | 17 | ) { } 18 | 19 | ngOnInit(): void { 20 | this.UploadProject = this.formBuilder.group({ 21 | projectTitle:['',[Validators.required]], 22 | projectName:['',[Validators.required]], 23 | comments:[''], 24 | GitRepo:['',[Validators.required]] 25 | 26 | 27 | }) 28 | } 29 | uploadproject(){ 30 | console.log(this.UploadProject.value); 31 | if(this.UploadProject.invalid){ 32 | return 33 | } 34 | this.DeveloperService.uploadProject( 35 | this.UploadProject.value.projectTitle, 36 | this.UploadProject.value.projectName, 37 | this.UploadProject.value.comments, 38 | this.UploadProject.value.GitRepo,) 39 | 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /Backend/app.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const bodyParser = require('body-parser'); 3 | const experss = require('express'); 4 | const mongoose = require("mongoose"); 5 | const cors = require ("cors") 6 | 7 | const userRoutes = require("./routes/user") 8 | const projectManagerRoutes = require('./routes/project-Manager') 9 | const developerRoutes = require("./routes/developer") 10 | 11 | const app = experss(); 12 | 13 | mongoose.connect("mongodb+srv://Jaffer-Ali:FlVV6jHYPdGdyolK@cluster1.3scmpgg.mongodb.net/Project-Management-site") 14 | .then(() =>{ 15 | console.log("conncted to database"); 16 | }) 17 | .catch((err) =>{ 18 | console.log(err); 19 | console.log("conncted failed"); 20 | }) 21 | 22 | app.use(bodyParser.json()); 23 | app.use(bodyParser.urlencoded({extended: false})); 24 | app.use(cors()) 25 | 26 | app.use((req, res, next) => { 27 | res.setHeader("Access-Control-Allow-Origin", "*"); 28 | res.setHeader( 29 | "Access-Control-Allow-Headers", 30 | "Origin, X-Requested-With, Content-Type, Accept, Authorization" 31 | ); 32 | res.setHeader( 33 | "Access-Control-Allow-Methods", 34 | "GET, POST, PATCH, PUT, DELETE, OPTIONS" 35 | ); 36 | next(); 37 | }); 38 | app.use("/api/developer", developerRoutes) 39 | app.use("/api/user", userRoutes); 40 | app.use("/api/project-Manager", projectManagerRoutes) 41 | 42 | 43 | module.exports = app; 44 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-details/user-details.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild } from '@angular/core'; 2 | import { projectDataService } from "../projectManager.service"; 3 | import { MatTableDataSource } from '@angular/material/table'; 4 | import {MatPaginator} from '@angular/material/paginator'; 5 | import { MatSort } from '@angular/material/sort'; 6 | import { AuthDataTable } from "../../../../auth/auth-data.model"; 7 | 8 | 9 | @Component({ 10 | selector: 'app-user-details', 11 | templateUrl: './user-details.component.html', 12 | styleUrls: ['./user-details.component.scss'] 13 | }) 14 | export class UserDetailsComponent implements OnInit { 15 | displayedColumns: string[] = ['UserName','Email', 'mobile','position']; 16 | User: any[] = [] 17 | dataSource : any; 18 | @ViewChild(MatPaginator) paginator !: MatPaginator; 19 | @ViewChild(MatSort) Sort !: MatSort; 20 | 21 | constructor(private UserData: projectDataService) { } 22 | 23 | ngOnInit(): void { 24 | this.GetUser(); 25 | } 26 | GetUser(){ 27 | this.UserData.getUser() 28 | .subscribe(result =>{ 29 | this.User = result; 30 | console.log(result); 31 | 32 | this.dataSource = new MatTableDataSource(this.User); 33 | this.dataSource.paginator = this.paginator; 34 | this.dataSource.sort = this.Sort; 35 | 36 | }) 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/home/home.component.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@600&family=Dongle&family=Open+Sans:wght@300;400&family=Righteous&family=Sarabun&display=swap'); 2 | 3 | body{ 4 | overflow-x: hidden; 5 | } 6 | .container-fluid { 7 | height: 230px; 8 | } 9 | .row{ 10 | padding-top: 20px; 11 | } 12 | .card-part-one{ 13 | max-width: 80%; 14 | margin-left: 20px; 15 | height: 180px; 16 | border-radius: 5%; 17 | 18 | } 19 | .row-2{ 20 | max-height: 500px; 21 | } 22 | .card-2{ 23 | max-width: 90%; 24 | height: 60px; 25 | margin-left: 50px; 26 | 27 | } 28 | .card-3{ 29 | background-color: rgb(255, 255, 255); 30 | height: 60px; 31 | 32 | } 33 | .head-1{ 34 | font-size: 20px; 35 | font-family:'Open Sans', sans-serif; 36 | font-weight: 600; 37 | margin-left: 20px; 38 | } 39 | .sub-head-1 { 40 | margin-top: -16px; 41 | font-family: 'Open Sans', sans-serif; 42 | margin-left: 30px; 43 | } 44 | table { 45 | width: 100%; 46 | 47 | } 48 | .btn-1{ 49 | margin-top: -20px; 50 | } 51 | .btn-2{ 52 | margin-left: 50px; 53 | } 54 | .row-two { 55 | padding: 0; 56 | 57 | } 58 | h1{ 59 | font-family: 'Open Sans', sans-serif; 60 | } 61 | .table-card{ 62 | border-radius: 20px; 63 | margin-left: 20px; 64 | 65 | } 66 | .form-serach{ 67 | margin-top: -40px; 68 | zoom: 80%; 69 | border-color: blue; 70 | } 71 | .project-head{ 72 | margin-top: -20px; 73 | } -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/home/home.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { LayoutModule } from '@angular/cdk/layout'; 2 | import { NoopAnimationsModule } from '@angular/platform-browser/animations'; 3 | import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; 4 | import { MatButtonModule } from '@angular/material/button'; 5 | import { MatCardModule } from '@angular/material/card'; 6 | import { MatGridListModule } from '@angular/material/grid-list'; 7 | import { MatIconModule } from '@angular/material/icon'; 8 | import { MatMenuModule } from '@angular/material/menu'; 9 | 10 | import { HomeComponent } from './home.component'; 11 | 12 | describe('HomeComponent', () => { 13 | let component: HomeComponent; 14 | let fixture: ComponentFixture; 15 | 16 | beforeEach(waitForAsync(() => { 17 | TestBed.configureTestingModule({ 18 | declarations: [HomeComponent], 19 | imports: [ 20 | NoopAnimationsModule, 21 | LayoutModule, 22 | MatButtonModule, 23 | MatCardModule, 24 | MatGridListModule, 25 | MatIconModule, 26 | MatMenuModule, 27 | ] 28 | }).compileComponents(); 29 | })); 30 | 31 | beforeEach(() => { 32 | fixture = TestBed.createComponent(HomeComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('should compile', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-nav/sub-nav.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { LayoutModule } from '@angular/cdk/layout'; 2 | import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; 3 | import { NoopAnimationsModule } from '@angular/platform-browser/animations'; 4 | import { MatButtonModule } from '@angular/material/button'; 5 | import { MatIconModule } from '@angular/material/icon'; 6 | import { MatListModule } from '@angular/material/list'; 7 | import { MatSidenavModule } from '@angular/material/sidenav'; 8 | import { MatToolbarModule } from '@angular/material/toolbar'; 9 | 10 | import { SubNavComponent } from './sub-nav.component'; 11 | 12 | describe('SubNavComponent', () => { 13 | let component: SubNavComponent; 14 | let fixture: ComponentFixture; 15 | 16 | beforeEach(waitForAsync(() => { 17 | TestBed.configureTestingModule({ 18 | declarations: [SubNavComponent], 19 | imports: [ 20 | NoopAnimationsModule, 21 | LayoutModule, 22 | MatButtonModule, 23 | MatIconModule, 24 | MatListModule, 25 | MatSidenavModule, 26 | MatToolbarModule, 27 | ] 28 | }).compileComponents(); 29 | })); 30 | 31 | beforeEach(() => { 32 | fixture = TestBed.createComponent(SubNavComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('should compile', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/nav-bar/nav-bar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { LayoutModule } from '@angular/cdk/layout'; 2 | import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; 3 | import { NoopAnimationsModule } from '@angular/platform-browser/animations'; 4 | import { MatButtonModule } from '@angular/material/button'; 5 | import { MatIconModule } from '@angular/material/icon'; 6 | import { MatListModule } from '@angular/material/list'; 7 | import { MatSidenavModule } from '@angular/material/sidenav'; 8 | import { MatToolbarModule } from '@angular/material/toolbar'; 9 | 10 | import { NavBarComponent } from './nav-bar.component'; 11 | 12 | describe('NavBarComponent', () => { 13 | let component: NavBarComponent; 14 | let fixture: ComponentFixture; 15 | 16 | beforeEach(waitForAsync(() => { 17 | TestBed.configureTestingModule({ 18 | declarations: [NavBarComponent], 19 | imports: [ 20 | NoopAnimationsModule, 21 | LayoutModule, 22 | MatButtonModule, 23 | MatIconModule, 24 | MatListModule, 25 | MatSidenavModule, 26 | MatToolbarModule, 27 | ] 28 | }).compileComponents(); 29 | })); 30 | 31 | beforeEach(() => { 32 | fixture = TestBed.createComponent(NavBarComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('should compile', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-users/all-users.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild } from '@angular/core'; 2 | import { projectDataService } from "../projectManager.service"; 3 | import { AuthData } from "../../../../auth/auth-data.model"; 4 | import { MatTableDataSource } from '@angular/material/table'; 5 | import {MatPaginator} from '@angular/material/paginator'; 6 | import { MatSort } from '@angular/material/sort'; 7 | 8 | 9 | 10 | @Component({ 11 | selector: 'app-all-users', 12 | templateUrl: './all-users.component.html', 13 | styleUrls: ['./all-users.component.scss'] 14 | }) 15 | export class AllUsersComponent implements OnInit { 16 | displayedColumns: string[] = ['UserName', 'Email','Add']; 17 | dataSource : any; 18 | User: AuthData[] = [] 19 | parentPost: any[] = [] 20 | @ViewChild(MatPaginator) paginator !: MatPaginator; 21 | @ViewChild(MatSort) Sort !: MatSort; 22 | 23 | 24 | constructor(public projectService: projectDataService) { } 25 | 26 | ngOnInit(): void { 27 | this.GetUser(); 28 | } 29 | 30 | GetUser(){ 31 | this.projectService.getUser() 32 | .subscribe(result =>{ 33 | this.User = result; 34 | console.log(result); 35 | 36 | this.dataSource = new MatTableDataSource(this.User); 37 | this.dataSource.paginator = this.paginator; 38 | this.dataSource.sort = this.Sort; 39 | }) 40 | } 41 | 42 | AssignPosition(data: any){ 43 | this.parentPost.push(data) 44 | 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-nav-bar/dev-nav-bar.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { LayoutModule } from '@angular/cdk/layout'; 2 | import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; 3 | import { NoopAnimationsModule } from '@angular/platform-browser/animations'; 4 | import { MatButtonModule } from '@angular/material/button'; 5 | import { MatIconModule } from '@angular/material/icon'; 6 | import { MatListModule } from '@angular/material/list'; 7 | import { MatSidenavModule } from '@angular/material/sidenav'; 8 | import { MatToolbarModule } from '@angular/material/toolbar'; 9 | 10 | import { DevNavBarComponent } from './dev-nav-bar.component'; 11 | 12 | describe('DevNavBarComponent', () => { 13 | let component: DevNavBarComponent; 14 | let fixture: ComponentFixture; 15 | 16 | beforeEach(waitForAsync(() => { 17 | TestBed.configureTestingModule({ 18 | declarations: [DevNavBarComponent], 19 | imports: [ 20 | NoopAnimationsModule, 21 | LayoutModule, 22 | MatButtonModule, 23 | MatIconModule, 24 | MatListModule, 25 | MatSidenavModule, 26 | MatToolbarModule, 27 | ] 28 | }).compileComponents(); 29 | })); 30 | 31 | beforeEach(() => { 32 | fixture = TestBed.createComponent(DevNavBarComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('should compile', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/nav-bar/nav-bar.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | Menu 7 | 8 | Dashboard 9 | All-projects 10 | Manage User 11 | Create Project 12 | 13 | 14 | 15 | 16 | 24 | Project-Management 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/project-manager-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { AllProjectsComponent } from './components/all-projects/all-projects.component'; 4 | import { AllUsersComponent } from './components/all-users/all-users.component'; 5 | import { CreateProjectComponent } from './components/create-project/create-project.component'; 6 | import { EditProjectComponent } from './components/edit-project/edit-project.component'; 7 | import { HomeComponent } from './components/home/home.component'; 8 | import { ProjectDetailsComponent } from './components/project-details/project-details.component'; 9 | import { ProjectManagerDashboardComponent } from './components/project-manager-dashboard/project-manager-dashboard.component'; 10 | 11 | const routes: Routes = [ 12 | {path:'', component: ProjectManagerDashboardComponent, 13 | 14 | children:[ 15 | { path: 'home', component:HomeComponent }, 16 | { path: 'all-projects', component:AllProjectsComponent}, 17 | { path: 'create-project', component:CreateProjectComponent}, 18 | { path: 'all-users', component:AllUsersComponent}, 19 | { path: 'Edit-Project', component:EditProjectComponent}, 20 | { path: 'Project-Details', component: ProjectDetailsComponent}, 21 | 22 | { path: '', redirectTo: '/project-manager/home', pathMatch: 'full' }, 23 | 24 | ] 25 | } 26 | ]; 27 | 28 | @NgModule({ 29 | imports: [RouterModule.forChild(routes)], 30 | exports: [RouterModule] 31 | }) 32 | export class ProjectManagerRoutingModule { } 33 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | jasmine: { 17 | // you can add configuration options for Jasmine here 18 | // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html 19 | // for example, you can disable the random execution with `random: false` 20 | // or set a specific seed with `seed: 4321` 21 | }, 22 | clearContext: false // leave Jasmine Spec Runner output visible in browser 23 | }, 24 | jasmineHtmlReporter: { 25 | suppressAll: true // removes the duplicated traces 26 | }, 27 | coverageReporter: { 28 | dir: require('path').join(__dirname, './coverage/project-management'), 29 | subdir: '.', 30 | reporters: [ 31 | { type: 'html' }, 32 | { type: 'text-summary' } 33 | ] 34 | }, 35 | reporters: ['progress', 'kjhtml'], 36 | port: 9876, 37 | colors: true, 38 | logLevel: config.LOG_INFO, 39 | autoWatch: true, 40 | browsers: ['Chrome'], 41 | singleRun: false, 42 | restartOnFileChange: true 43 | }); 44 | }; 45 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-details/user-details.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

All Users

4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
Full Name {{element.FullName}} Email {{element.email}} Phone Number {{element.mobile}} Position {{element.position}}
35 | 36 | 37 |
38 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/user-position/user-position.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { FormControl, FormGroup, FormBuilder, Validators } from "@angular/forms"; 3 | import { ActivatedRoute, Router } from '@angular/router'; 4 | import { projectDataService } from "../projectManager.service"; 5 | import { UserDetailsComponent } from "../user-details/user-details.component"; 6 | 7 | @Component({ 8 | selector: 'app-user-position', 9 | templateUrl: './user-position.component.html', 10 | styleUrls: ['./user-position.component.scss'] 11 | }) 12 | export class UserPositionComponent implements OnInit { 13 | public Userassignform! : FormGroup 14 | public UserData: any[] = [] 15 | @Input() childPost: any[] = [] 16 | 17 | constructor( 18 | private formBuilder: FormBuilder, 19 | private ProjectService: projectDataService, 20 | private router: Router, 21 | private route: ActivatedRoute 22 | ) { } 23 | 24 | ngOnInit(): void { 25 | this.Userassignform = this.formBuilder.group({ 26 | position:['',[Validators.required]], 27 | userId:[''] 28 | }) 29 | 30 | } 31 | assignUser(){ 32 | console.log(this.Userassignform.value); 33 | if(this.Userassignform.invalid){ 34 | return 35 | } 36 | this.ProjectService.updateUserPosition(this.Userassignform.value.position, this.Userassignform.value.userId) 37 | this.router.routeReuseStrategy.shouldReuseRoute = () => false; 38 | this.router.onSameUrlNavigation = 'reload'; 39 | this.router.navigate(['./'], { 40 | relativeTo: this.route 41 | }) 42 | 43 | 44 | } 45 | 46 | 47 | } -------------------------------------------------------------------------------- /src/app/modules/developer/components/project-works/project-works.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormControl, FormGroup, Validator,FormBuilder, Validators } from "@angular/forms"; 3 | import { ActivatedRoute, Router } from '@angular/router'; 4 | import { DeveloperService } from "../developer.service"; 5 | 6 | @Component({ 7 | selector: 'app-project-works', 8 | templateUrl: './project-works.component.html', 9 | styleUrls: ['./project-works.component.scss'] 10 | }) 11 | export class ProjectWorksComponent implements OnInit { 12 | public UpdateProjectStatus! : FormGroup 13 | 14 | constructor( 15 | private FormBuilder: FormBuilder, 16 | private DeveloperService: DeveloperService, 17 | private router: Router, 18 | private route: ActivatedRoute 19 | ) { } 20 | 21 | ngOnInit(): void { 22 | 23 | this.UpdateProjectStatus = this.FormBuilder.group({ 24 | projectTitle:['',[Validators.required]], 25 | projectName:['',[Validators.required]], 26 | ProjectStatus:['',[Validators.required]] 27 | }) 28 | } 29 | DeveloperSubmit(){ 30 | console.log(this.UpdateProjectStatus.value); 31 | if(this.UpdateProjectStatus.invalid){ 32 | return 33 | } 34 | this.DeveloperService.Updateproject( 35 | this.UpdateProjectStatus.value.projectTitle, 36 | this.UpdateProjectStatus.value.projectName, 37 | this.UpdateProjectStatus.value.ProjectStatus) 38 | this.router.routeReuseStrategy.shouldReuseRoute = () => false; 39 | this.router.onSameUrlNavigation = 'reload'; 40 | this.router.navigate(['./'], { 41 | relativeTo: this.route 42 | }) 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/app/auth/login/login.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 |
7 |
8 |
9 |

Login Here

10 | 11 | Enter the Email 12 | 15 | Email is required 16 | please entered valid mail 17 | 18 | 19 | 20 | password 21 | 24 | password is required 25 | 26 | 27 | 28 | 29 | 33 | 36 |
37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/developer.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from "@angular/common/http"; 3 | import { map, Observable, Subject } from "rxjs"; 4 | import { HotToastService } from '@ngneat/hot-toast'; 5 | import { updateprojectface, UploadProjectInter } from "../components/dev-projectData.model"; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class DeveloperService { 11 | private update_project_status: string = 'http://localhost:3000/api/developer/updateProjectStatus'; 12 | private upload_project: string = 'http://localhost:3000/api/developer/UploadProject' 13 | 14 | constructor(private http: HttpClient, private toast: HotToastService) { } 15 | 16 | Updateproject(projectTitle: string,projectName: string,ProjectStatus: string){ 17 | const updateprojects: updateprojectface ={ 18 | projectTitle: projectTitle, 19 | projectName: projectName, 20 | ProjectStatus: ProjectStatus} 21 | console.log(updateprojects); 22 | this.http.post("http://localhost:3000/api/developer/updateProjectStatus", updateprojects) 23 | .subscribe(res =>{ 24 | console.log(res); 25 | 26 | }) 27 | } 28 | uploadProject(projectTitle: string,projectName: string,comments: string, GitRepo: string){ 29 | const uploadProjectInter: UploadProjectInter ={ 30 | projectTitle:projectTitle, 31 | projectName:projectName, 32 | comments:comments, 33 | GitRepo:GitRepo} 34 | console.log(uploadProjectInter); 35 | this.http.put("http://localhost:3000/api/developer/UploadProject",uploadProjectInter ) 36 | .subscribe(res =>{ 37 | console.log(res); 38 | }) 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/app/modules/developer/developer.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { DeveloperRoutingModule } from './developer-routing.module'; 5 | import { DeveloperDashboardComponent } from './components/developer-dashboard/developer-dashboard.component'; 6 | import { MatSidenavModule } from '@angular/material/sidenav'; 7 | import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; 8 | import { HttpClientModule } from '@angular/common/http'; 9 | import { DevNavBarComponent } from './components/dev-nav-bar/dev-nav-bar.component'; 10 | import { AngularMaterialModule } from "../../angular-material.module"; 11 | import { MatCardModule } from '@angular/material/card'; 12 | import { DevHomeComponent } from './components/dev-home/dev-home.component'; 13 | import { DevProjectDetailsComponent } from './components/dev-project-details/dev-project-details.component'; 14 | import { ProjectWorksComponent } from './components/project-works/project-works.component'; 15 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 16 | import { UploadProjectComponent } from './components/upload-project/upload-project.component'; 17 | 18 | @NgModule({ 19 | declarations: [ 20 | DeveloperDashboardComponent, 21 | DevNavBarComponent, 22 | DevHomeComponent, 23 | DevProjectDetailsComponent, 24 | ProjectWorksComponent, 25 | UploadProjectComponent 26 | ], 27 | imports: [ 28 | CommonModule, 29 | DeveloperRoutingModule, 30 | FontAwesomeModule, 31 | HttpClientModule, 32 | MatSidenavModule, 33 | AngularMaterialModule, 34 | MatCardModule, 35 | FormsModule, 36 | ReactiveFormsModule 37 | 38 | ] 39 | }) 40 | export class DeveloperModule { } 41 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { MdbCheckboxModule } from 'mdb-angular-ui-kit/checkbox'; 4 | import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; 5 | 6 | import { AppRoutingModule } from './app-routing.module'; 7 | import { AppComponent } from './app.component'; 8 | import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; 9 | import { HttpClientModule, HTTP_INTERCEPTORS } from "@angular/common/http"; 10 | import { AngularMaterialModule } from "./angular-material.module"; 11 | import { LoginComponent } from './auth/login/login.component'; 12 | import { RegisterComponent } from './auth/register/register.component'; 13 | import { MatIconModule } from '@angular/material/icon'; 14 | import { ReactiveFormsModule, FormsModule } from "@angular/forms"; 15 | import { AuthInterceptor } from './auth/auth-interceptor'; 16 | import { LandingPageComponent } from './auth/landing-page/landing-page.component'; 17 | import { HotToastModule } from '@ngneat/hot-toast'; 18 | 19 | 20 | 21 | @NgModule({ 22 | declarations: [ 23 | AppComponent, 24 | LoginComponent, 25 | RegisterComponent, 26 | LandingPageComponent 27 | 28 | ], 29 | imports: [ 30 | BrowserModule, 31 | AppRoutingModule, 32 | BrowserAnimationsModule, 33 | HttpClientModule, 34 | AngularMaterialModule, 35 | MatIconModule, 36 | ReactiveFormsModule, 37 | FormsModule, 38 | MdbCheckboxModule, 39 | FontAwesomeModule, 40 | HotToastModule.forRoot() 41 | 42 | ], 43 | providers: [{provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true}], 44 | bootstrap: [AppComponent] 45 | }) 46 | export class AppModule { } 47 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-home/dev-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild } from '@angular/core'; 2 | import {MatPaginator} from '@angular/material/paginator'; 3 | import {MatTableDataSource} from '@angular/material/table'; 4 | import { MatSort } from '@angular/material/sort'; 5 | import { projectDataService } from "../../../project-manager/components/projectManager.service"; 6 | import { getprojectData } from "../dev-projectData.model"; 7 | import {MatDialog} from '@angular/material/dialog'; 8 | import { DevProjectDetailsComponent } from '../dev-project-details/dev-project-details.component'; 9 | @Component({ 10 | selector: 'app-dev-home', 11 | templateUrl: './dev-home.component.html', 12 | styleUrls: ['./dev-home.component.scss'] 13 | }) 14 | export class DevHomeComponent implements OnInit { 15 | displayedColumns: string[] = ['projectTitle', 'projectName', 'projectType', 'created', 'Details']; 16 | project: getprojectData[]=[] 17 | dataSource: any 18 | 19 | @ViewChild(MatPaginator) paginator !: MatPaginator; 20 | @ViewChild(MatSort) Sort !: MatSort; 21 | 22 | 23 | constructor(public projectService:projectDataService, private dialog : MatDialog ) { } 24 | 25 | ngOnInit(): void { 26 | this.GetProject(); 27 | } 28 | GetProject(){ 29 | this.projectService.getProject().subscribe(result =>{ 30 | this.project = result; 31 | 32 | this.dataSource = new MatTableDataSource(this.project) 33 | this.dataSource.paginator = this.paginator; 34 | this.dataSource.Sort = this.Sort; 35 | }) 36 | } 37 | ProjectDetails(element: any){ 38 | const dialog = this.dialog.open(DevProjectDetailsComponent,{ 39 | width: '40%', 40 | data: element 41 | }) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/project-details/project-details.component.html: -------------------------------------------------------------------------------- 1 | 2 |

Project Details

3 |
4 | 5 |
6 |
7 |

Project Title

8 |
9 |

{{name.projectTitle}}

10 |
11 |
12 |
13 |

Project Name

14 |

{{name.projectName}}

15 |
16 |
17 |
18 |
19 |

Submitter

20 |

{{name.submitter}}

21 |
22 |
23 |

24 | Project Type 25 |

26 |

{{name.projectType}}

27 |
28 |
29 |
30 |
31 |

Developer

32 |

{{name.Developer}}

33 |
34 |
35 | 36 |
37 |
38 | 39 | {{name.features}} 40 | 41 |
42 |
43 |

Created Date

44 |

45 | {{name.created}} 46 |

47 |

Dead Line

48 |

{{name.deadLine}}

49 |
50 |
51 | 52 |
53 | 54 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-home/sub-home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild } from '@angular/core'; 2 | import {MatPaginator} from '@angular/material/paginator'; 3 | import {MatTableDataSource} from '@angular/material/table'; 4 | import { MatSort } from '@angular/material/sort'; 5 | import {MatDialog} from '@angular/material/dialog'; 6 | import { projectDataService } from 'src/app/modules/project-manager/components/projectManager.service'; 7 | import { getprojectData } from 'src/app/modules/project-manager/components/project-data.model'; 8 | import { SubProjectDetailsComponent } from '../sub-project-details/sub-project-details.component'; 9 | 10 | @Component({ 11 | selector: 'app-sub-home', 12 | templateUrl: './sub-home.component.html', 13 | styleUrls: ['./sub-home.component.scss'] 14 | }) 15 | export class SubHomeComponent implements OnInit { 16 | displayedColumns: string[] = ['projectTitle', 'projectName', 'projectType', 'created', 'Details']; 17 | project: getprojectData[]=[] 18 | dataSource: any 19 | 20 | 21 | @ViewChild(MatPaginator) paginator !: MatPaginator; 22 | @ViewChild(MatSort) Sort !: MatSort; 23 | 24 | 25 | constructor(public projectService:projectDataService, private dialog : MatDialog) { } 26 | 27 | ngOnInit(): void { 28 | this.GetProject() 29 | 30 | } 31 | 32 | GetProject(){ 33 | this.projectService.getProject().subscribe(result =>{ 34 | this.project = result 35 | 36 | 37 | this.dataSource = new MatTableDataSource(this.project) 38 | this.dataSource.paginator = this.paginator; 39 | this.dataSource.Sort = this.Sort; 40 | }) 41 | } 42 | ProjectDetails(element: any){ 43 | const dialog = this.dialog.open(SubProjectDetailsComponent,{ 44 | width:'40%', 45 | data: element 46 | }) 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/app/modules/submitter/submitter.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { SubmitterRoutingModule } from './submitter-routing.module'; 5 | import { SubHomeComponent } from './components/sub-home/sub-home.component'; 6 | import { SubNavComponent } from './components/sub-nav/sub-nav.component'; 7 | import { LayoutModule } from '@angular/cdk/layout'; 8 | import { MatToolbarModule } from '@angular/material/toolbar'; 9 | import { MatButtonModule } from '@angular/material/button'; 10 | import { MatSidenavModule } from '@angular/material/sidenav'; 11 | import { MatIconModule } from '@angular/material/icon'; 12 | import { MatListModule } from '@angular/material/list'; 13 | import { SubmitterDashboardComponent } from './components/submitter-dashboard/submitter-dashboard.component'; 14 | import { HttpClientModule } from '@angular/common/http'; 15 | import { AngularMaterialModule } from 'src/app/angular-material.module'; 16 | import { SubProjectDetailsComponent } from './components/sub-project-details/sub-project-details.component'; 17 | import { ReportBugComponent } from './components/report-bug/report-bug.component'; 18 | import { ListBugComponent } from './components/list-bug/list-bug.component'; 19 | import { ReactiveFormsModule } from '@angular/forms'; 20 | 21 | 22 | @NgModule({ 23 | declarations: [ 24 | SubHomeComponent, 25 | SubNavComponent, 26 | SubmitterDashboardComponent, 27 | SubProjectDetailsComponent, 28 | ReportBugComponent, 29 | ListBugComponent 30 | ], 31 | imports: [ 32 | CommonModule, 33 | SubmitterRoutingModule, 34 | LayoutModule, 35 | MatToolbarModule, 36 | MatButtonModule, 37 | MatSidenavModule, 38 | MatIconModule, 39 | MatListModule, 40 | MatSidenavModule, 41 | HttpClientModule, 42 | AngularMaterialModule, 43 | ReactiveFormsModule 44 | ] 45 | }) 46 | export class SubmitterModule { } 47 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-project-details/sub-project-details.component.html: -------------------------------------------------------------------------------- 1 | 2 |

Project Details

3 |
4 |
5 |
6 |
7 |

project Title

8 |

{{pro.projecTitle}}

9 |
10 |
11 |

project Name

12 |

{{pro.projectName}}

13 |
14 |
15 |
16 |
17 |

Project Type

18 |

{{pro.projectType}}

19 |
20 |
21 |

Developer

22 |

{{pro.Developer}}

23 |
24 |
25 | 26 |
27 |
28 | 29 |

Comments

30 |

{{pro.comments}}

31 |
32 |
33 |
34 |
35 |
36 |

Created date

37 |

{{pro.created}}

38 |
39 |
40 |

Dead Line

41 |

{{pro.deadLine}}

42 |
43 |
44 |
45 |
46 | 47 |
48 |
49 |
50 |

GitHub repository

51 | 52 | {{pro.GitRep}} 53 | 54 |
55 |
56 |
57 |
58 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/all-users/all-users.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 |
Full Name {{element.FullName}} Email {{element.email}} Assign position 26 |
add
27 |
34 | 35 | 36 | 37 |
38 | 39 | 40 | 41 |
42 | 43 |
44 | 45 |
46 |
47 |
48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project-management", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "watch": "ng build --watch --configuration development", 9 | "test": "ng test", 10 | "start:server": "nodemon server.js" 11 | }, 12 | "private": true, 13 | "dependencies": { 14 | "@angular/animations": "^14.0.0", 15 | "@angular/cdk": "^14.1.0", 16 | "@angular/common": "^14.0.0", 17 | "@angular/compiler": "^14.0.0", 18 | "@angular/core": "^14.0.0", 19 | "@angular/forms": "^14.0.0", 20 | "@angular/material": "^14.1.0", 21 | "@angular/platform-browser": "^14.0.0", 22 | "@angular/platform-browser-dynamic": "^14.0.0", 23 | "@angular/router": "^14.0.0", 24 | "@fortawesome/angular-fontawesome": "^0.11.1", 25 | "@fortawesome/fontawesome-free": "^6.1.2", 26 | "@fortawesome/fontawesome-svg-core": "^6.1.2", 27 | "@fortawesome/free-brands-svg-icons": "^6.1.2", 28 | "@fortawesome/free-solid-svg-icons": "^6.1.2", 29 | "@material/card": "^14.0.0", 30 | "@ngneat/hot-toast": "^4.1.0", 31 | "bcrypt": "^5.0.1", 32 | "body-parser": "^1.20.0", 33 | "cors": "^2.8.5", 34 | "express": "^4.18.1", 35 | "jsonwebtoken": "^8.5.1", 36 | "mdb-angular-ui-kit": "^2.3.0", 37 | "mongoose": "^6.4.6", 38 | "mongoose-unique-validator": "^3.1.0", 39 | "rxjs": "~7.5.0", 40 | "sweetalert2": "^11.4.24", 41 | "tslib": "^2.3.0", 42 | "zone.js": "~0.11.4" 43 | }, 44 | "devDependencies": { 45 | "@angular-devkit/build-angular": "^14.0.2", 46 | "@angular/cli": "~14.0.2", 47 | "@angular/compiler-cli": "^14.0.0", 48 | "@types/jasmine": "~4.0.0", 49 | "jasmine-core": "~4.1.0", 50 | "karma": "~6.3.0", 51 | "karma-chrome-launcher": "~3.1.0", 52 | "karma-coverage": "~2.2.0", 53 | "karma-jasmine": "~5.0.0", 54 | "karma-jasmine-html-reporter": "~1.7.0", 55 | "nodemon": "^2.0.19", 56 | "typescript": "~4.7.2" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Backend/routes/project-Manager.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const projectData = require("../models/project-model"); 4 | const userData = require("../models/user"); 5 | 6 | router.post("/create-project", async (req, res, next) => { 7 | const project = new projectData(req.body); 8 | await project.save().then((createProject) => { 9 | res.status(201).json({ 10 | message: "post successfully", 11 | Project: { 12 | ...createProject, 13 | id: createProject._id, 14 | }, 15 | }); 16 | }); 17 | }); 18 | 19 | router.get("/home", async (req, res, next) => { 20 | const AllProject = projectData.find().then((documents) => { 21 | res.status(200).json(documents); 22 | }); 23 | }); 24 | 25 | router.get("/alluser", async (req, res, next) => { 26 | const Alluser = userData.find().then((user) => { 27 | res.status(200).json(user); 28 | }); 29 | }); 30 | router.put("/updateProject/:id", async (req, res) => { 31 | let proId = req.params.id; 32 | let data = req.body; 33 | await projectData 34 | .updateOne( 35 | { _id: proId }, 36 | { 37 | $set: { 38 | projectTitle: data.projectTitle, 39 | projectName: data.projectName, 40 | projectType: data.projectType, 41 | created: data.created, 42 | deadLine: data.deadLine, 43 | features: data.features, 44 | Developer: data.Developer, 45 | submitter: data.submitter, 46 | }, 47 | } 48 | ) 49 | .then((result) => { 50 | res.status(200).json(result); 51 | }); 52 | }); 53 | router.get("/getDevelopers", (req,res)=>{ 54 | const AllDevelopers = userData.find({position:"Developer"}) 55 | .then((result)=>{ 56 | res.status(200).json(result); 57 | }) 58 | 59 | }) 60 | router.get("/getSubmitters", (req,res)=>{ 61 | const AllSubmitters = userData.find({position:"Submitter"}) 62 | .then((result)=>{ 63 | res.status(200).json(result); 64 | }) 65 | }) 66 | 67 | 68 | module.exports = router; 69 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-project-details/dev-project-details.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |

Project Details

6 |
7 |
8 |
9 |
10 |

Project Title

11 |

{{name.projectTitle}}

12 |
13 |
14 |

Project Name

15 |

{{name.projectName}}

16 |
17 | 18 |
19 | 20 |
21 |

Submitter

22 |

{{name.submitter}}

23 |
24 |
25 |

Project Type

26 |

{{name.projectType}}

27 |
28 |
29 |
30 |

Developer

31 |

{{name.Developer}}

32 |
33 |
34 | 35 |
36 | 37 |

{{name.features}}

38 |
39 |
40 |
41 |
42 |
43 |

Created Date

44 |

{{name.created}}

45 |
46 |
47 |

Dead Line

48 |

{{name.deadLine}}

49 |
50 |
51 |
52 | 53 |
54 |
55 | -------------------------------------------------------------------------------- /src/app/auth/register/register.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormGroup,FormControl, Validators, ValidatorFn, AbstractControl, ValidationErrors } from "@angular/forms"; 3 | import { AuthService } from '../auth.service'; 4 | import { Router } from '@angular/router'; 5 | import Validation from "src/app/auth/utils/validation"; 6 | 7 | export function passwordsMatchValidator(): ValidatorFn { 8 | return(control: AbstractControl): ValidationErrors | null => { 9 | const password = control.get('password')?.value; 10 | const confirmPassword = control.get('confirmPassword')?.value; 11 | 12 | if(password && confirmPassword && password !== confirmPassword){ 13 | return { 14 | passwordsDontMatch: true 15 | } 16 | 17 | } 18 | 19 | return null; 20 | } 21 | } 22 | 23 | @Component({ 24 | selector: 'app-register', 25 | templateUrl: './register.component.html', 26 | styleUrls: ['./register.component.scss'] 27 | }) 28 | export class RegisterComponent implements OnInit { 29 | 30 | RegisterForm = new FormGroup({ 31 | FullName: new FormControl('',Validators.required), 32 | email: new FormControl('', [Validators.email, Validators.required]), 33 | mobile: new FormControl('',Validators.required), 34 | password: new FormControl('',[Validators.required,Validators.maxLength(4)]), 35 | confirmPassword:new FormControl('',Validators.required) 36 | 37 | }, 38 | {validators: passwordsMatchValidator()} 39 | ); 40 | 41 | 42 | constructor( public authService: AuthService) { } 43 | 44 | ngOnInit(): void {} 45 | 46 | get FullName(){ 47 | return this.RegisterForm.get('FullName') 48 | } 49 | get email(){ 50 | return this.RegisterForm.get('email') 51 | } 52 | get mobile(){ 53 | return this.RegisterForm.get('mobile') 54 | } 55 | get password(){ 56 | return this.RegisterForm.get('password') 57 | } 58 | get confirmPassword(){ 59 | return this.RegisterForm.get('confirmPassword') 60 | } 61 | 62 | onRegister(){ 63 | if(this.RegisterForm.invalid){ 64 | return; 65 | } 66 | const {FullName, email, mobile, password}: any = this.RegisterForm.value; 67 | this.authService.createUser(FullName, email, mobile, password); 68 | 69 | } 70 | } -------------------------------------------------------------------------------- /src/app/modules/project-manager/project-manager.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { MatNativeDateModule } from "@angular/material/core"; 4 | 5 | 6 | import { ProjectManagerRoutingModule } from './project-manager-routing.module'; 7 | import { ProjectManagerDashboardComponent } from './components/project-manager-dashboard/project-manager-dashboard.component'; 8 | import { NavBarComponent } from "./components/nav-bar/nav-bar.component"; 9 | import { HomeComponent } from './components/home/home.component'; 10 | import { AllProjectsComponent } from './components/all-projects/all-projects.component'; 11 | import { AngularMaterialModule } from "../../angular-material.module"; 12 | import { MatSidenavModule } from '@angular/material/sidenav'; 13 | import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; 14 | import { CreateProjectComponent } from './components/create-project/create-project.component'; 15 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 16 | import { HttpClientModule } from '@angular/common/http'; 17 | import { AllUsersComponent } from './components/all-users/all-users.component'; 18 | import { EditProjectComponent } from './components/edit-project/edit-project.component'; 19 | import { ProjectDetailsComponent } from './components/project-details/project-details.component'; 20 | import { UserPositionComponent } from './components/user-position/user-position.component'; 21 | import { UserDetailsComponent } from './components/user-details/user-details.component'; 22 | 23 | 24 | 25 | @NgModule({ 26 | declarations: [ 27 | ProjectManagerDashboardComponent, 28 | NavBarComponent, 29 | HomeComponent, 30 | AllProjectsComponent, 31 | CreateProjectComponent, 32 | AllUsersComponent, 33 | EditProjectComponent, 34 | ProjectDetailsComponent, 35 | UserPositionComponent, 36 | UserDetailsComponent 37 | ], 38 | imports: [ 39 | CommonModule, 40 | ProjectManagerRoutingModule, 41 | AngularMaterialModule, 42 | MatSidenavModule, 43 | FontAwesomeModule, 44 | ReactiveFormsModule, 45 | FormsModule, 46 | HttpClientModule, 47 | MatNativeDateModule 48 | 49 | ], 50 | }) 51 | export class ProjectManagerModule { } 52 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, ViewChild} from '@angular/core'; 2 | import { faProjectDiagram } from "@fortawesome/free-solid-svg-icons"; 3 | import { getprojectData } from "../project-data.model"; 4 | import { projectDataService } from "../projectManager.service"; 5 | import {MatPaginator} from '@angular/material/paginator'; 6 | import {MatTableDataSource} from '@angular/material/table'; 7 | import { MatSort } from '@angular/material/sort'; 8 | import {MatDialog} from '@angular/material/dialog'; 9 | import { EditProjectComponent } from '../edit-project/edit-project.component'; 10 | import { ProjectDetailsComponent } from "../project-details/project-details.component"; 11 | 12 | 13 | 14 | @Component({ 15 | selector: 'app-home', 16 | templateUrl: './home.component.html', 17 | styleUrls: ['./home.component.scss'] 18 | }) 19 | export class HomeComponent implements OnInit { 20 | displayedColumns: string[] = ['projectTitle', 'projectName', 'projectType', 'created','status', 'Details','Edit']; 21 | dataSource : any 22 | project: getprojectData[] = []; 23 | 24 | 25 | @ViewChild(MatPaginator) paginator !: MatPaginator; 26 | @ViewChild(MatSort) Sort !: MatSort; 27 | 28 | 29 | faProjectDiagram = faProjectDiagram; 30 | 31 | 32 | constructor(public projectService: projectDataService, private dialog : MatDialog) {} 33 | 34 | 35 | ngOnInit(): void { 36 | this.GetProject(); 37 | } 38 | 39 | GetProject(){ 40 | this.projectService.getProject().subscribe(result =>{ 41 | this.project = result; 42 | 43 | 44 | this.dataSource = new MatTableDataSource(this.project) 45 | this.dataSource.paginator = this.paginator; 46 | this.dataSource.Sort = this.Sort; 47 | }) 48 | } 49 | 50 | UpdateProject(element: any) { 51 | console.log(element); 52 | const dialogRef = this.dialog.open(EditProjectComponent,{ 53 | width: '50%', 54 | data:element 55 | }).afterClosed().subscribe(val=>{ 56 | if(val === 'update'){ 57 | this.GetProject(); 58 | } 59 | }) 60 | 61 | } 62 | ProjectDetails(element: any){ 63 | const dialogRef = this.dialog.open(ProjectDetailsComponent,{ 64 | width: '40%', 65 | data:element 66 | }) 67 | } 68 | } 69 | 70 | 71 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/upload-project/upload-project.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 |

Upload Project

6 |
7 |
8 |
9 |
10 |
11 |
12 | 13 | Project Title 14 | 15 | border_color 16 | 17 |
18 |
19 | 20 | Project Name 21 | 22 | text_fields 23 | 24 |
25 |
26 |
27 |
28 | 29 | 30 | Comment 31 | 32 | 33 | 34 |
35 |
36 |
37 |
38 | 39 | GitHub Repository 40 | 41 | cloud_upload 42 | 43 |
44 |
45 |
46 | 47 |
48 |
49 |
50 |
51 |
-------------------------------------------------------------------------------- /src/app/modules/submitter/components/report-bug/report-bug.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 |
7 | 8 |
9 |

Report Bugs

10 |
11 |
12 |
13 |
14 | 15 | Project Title 16 | 17 | bookmark 18 | Hint 19 | 20 |
21 |
22 | 23 | Project Name 24 | 25 | remove_from_queue 26 | Hint 27 | 28 |
29 |
30 |
31 | 32 | Project Type 33 | 34 | keyboard 35 | Hint 36 | 37 |
38 |
39 | 40 | No of Bugs 41 | 42 | add_alert 43 | Hint 44 | 45 |
46 |
47 |
48 | 49 |
50 | 53 | 54 |
55 | 56 |
57 |
58 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes recent versions of Safari, Chrome (including 12 | * Opera), Edge on the desktop, and iOS and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** 22 | * By default, zone.js will patch all possible macroTask and DomEvents 23 | * user can disable parts of macroTask/DomEvents patch by setting following flags 24 | * because those flags need to be set before `zone.js` being loaded, and webpack 25 | * will put import in the top of bundle, so user need to create a separate file 26 | * in this directory (for example: zone-flags.ts), and put the following flags 27 | * into that file, and then add the following code before importing zone.js. 28 | * import './zone-flags'; 29 | * 30 | * The flags allowed in zone-flags.ts are listed here. 31 | * 32 | * The following flags will work for all browsers. 33 | * 34 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 35 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 36 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 37 | * 38 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 39 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 40 | * 41 | * (window as any).__Zone_enable_cross_context_check = true; 42 | * 43 | */ 44 | 45 | /*************************************************************************************************** 46 | * Zone JS is required by default for Angular itself. 47 | */ 48 | import 'zone.js'; // Included with Angular CLI. 49 | 50 | 51 | /*************************************************************************************************** 52 | * APPLICATION IMPORTS 53 | */ 54 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/create-project/create-project.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormControl,FormGroup,Validators } from "@angular/forms"; 3 | import { projectDataService } from "../projectManager.service"; 4 | import { } from "../project-data.model"; 5 | 6 | 7 | @Component({ 8 | selector: 'app-create-project', 9 | templateUrl: './create-project.component.html', 10 | styleUrls: ['./create-project.component.scss'] 11 | }) 12 | export class CreateProjectComponent implements OnInit { 13 | User: any[] = [] 14 | Submitter: any[] = [] 15 | 16 | projectCreated = new FormGroup({ 17 | projectTitle: new FormControl('',Validators.required), 18 | projectName: new FormControl('', Validators.required), 19 | projectType: new FormControl('',Validators.required), 20 | created: new FormControl('',Validators.required), 21 | deadLine:new FormControl('',Validators.required), 22 | features: new FormControl('',Validators.required), 23 | Developer: new FormControl('',Validators.required), 24 | submitter: new FormControl('',Validators.required) 25 | }) 26 | 27 | constructor(public ProjectService: projectDataService) { } 28 | 29 | ngOnInit(): void { 30 | this.ProjectService.getDevelopers() 31 | .subscribe(result =>{ 32 | this.User = result 33 | console.log(this.User); 34 | }) 35 | this.ProjectService.getSubmitter() 36 | .subscribe(responce =>{ 37 | this.Submitter = responce 38 | console.log(this.Submitter); 39 | }) 40 | } 41 | 42 | get projectTitle(){ 43 | return this.projectCreated.get('projectTitle') 44 | } 45 | get projectName(){ 46 | return this.projectCreated.get('projectName') 47 | } 48 | get projectType(){ 49 | return this.projectCreated.get('projectType') 50 | } 51 | get created(){ 52 | return this.projectCreated.get('created') 53 | } 54 | get deadLine(){ 55 | return this.projectCreated.get('deadLine') 56 | } 57 | get features(){ 58 | return this.projectCreated.get('features') 59 | } 60 | get Developer(){ 61 | return this.projectCreated.get('Developer') 62 | } 63 | get submitter(){ 64 | return this.projectCreated.get('submitter') 65 | } 66 | 67 | createProject(){ 68 | console.log(this.projectCreated.value); 69 | if(this.projectCreated.invalid){ 70 | return; 71 | } 72 | const {projectTitle,projectName,projectType,created,deadLine,features,Developer,submitter}: any = this.projectCreated.value; 73 | this.ProjectService.createProject(projectTitle,projectName,projectType,created,deadLine,features,Developer,submitter); 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/project-works/project-works.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 | 7 |
8 |

Update project Status

9 |
10 |
11 |
12 |
13 |
14 |
15 | 16 | Project Title 17 | 18 | border_color 19 | 20 |
21 |
22 |
23 |
24 | 25 | Project Name 26 | 27 | text_fields 28 | 29 |
30 |
31 |
32 |
33 | 34 | Select Project Status 35 | 36 | processing 37 | completed 38 | Uploaded 39 | 40 | 41 |
42 |
43 |
44 |
45 | 46 |
47 |
48 |
49 |
50 |
51 |
52 | 53 |
54 |
55 |
-------------------------------------------------------------------------------- /Backend/routes/user.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const User = require("../models/user"); 3 | const router = express.Router(); 4 | const bcrypt = require("bcrypt"); 5 | const jwt = require("jsonwebtoken"); 6 | const userData = require("../models/user"); 7 | 8 | 9 | 10 | router.post('/register', (req, res, next) => { 11 | console.log(req.body); 12 | const { FullName, email, mobile, password } = req.body 13 | if (!email || !password ) { 14 | return res.status(422).json({error: "please fill the details"}) 15 | } 16 | 17 | User.findOne({ email: email }).then((savedUser) => { 18 | if (savedUser) { 19 | return res.status(422).json({ error: "user already exists with that email" }) 20 | } 21 | 22 | bcrypt.hash(password, 12).then((hashedPassword) => { 23 | const user = new User({ 24 | FullName, 25 | email, 26 | mobile, 27 | password: hashedPassword, 28 | }) 29 | 30 | user.save().then((user) => { 31 | res.json({ message: 'saved successfully' }) 32 | }).catch((err) => { 33 | console.log(err); 34 | if(err.code === 11000){ 35 | return res.status(422).json({ error: "user name already taken" }) 36 | } 37 | }) 38 | }) 39 | 40 | }).catch(() => { 41 | console.log(err); 42 | }) 43 | 44 | }) 45 | 46 | router.post("/login", (req, res, next) => { 47 | let fetchUser; 48 | User.findOne({ email: req.body.email }) 49 | .then((user) => { 50 | if (!user) { 51 | return res.status(401).json({ 52 | message: "Auth failed", 53 | }); 54 | } 55 | fetchUser = user; 56 | return bcrypt.compare(req.body.password, user.password); 57 | }) 58 | .then((result) => { 59 | if (!result) { 60 | return res.status(401).json({ 61 | message: "Auth failed", 62 | }); 63 | } 64 | const token = jwt.sign( 65 | { email: fetchUser.email, userId: fetchUser._id }, 66 | "secret_this_should_be_longer", 67 | { expiresIn: "1h" } 68 | ); 69 | res.status(200).json({ 70 | token: token, 71 | expiresIn: 3600 72 | }); 73 | }) 74 | .catch((err) => { 75 | console.log(err); 76 | }); 77 | }); 78 | router.put("/updateUser/:id", async(req,res)=>{ 79 | let userId = req.params.id 80 | let data = req.body 81 | console.log(userId); 82 | await userData.updateOne({_id: userId}, 83 | { 84 | $set:{ 85 | position : data.position, 86 | } 87 | } 88 | ).then((result)=>{ 89 | console.log(result); 90 | res.status(200).json(result) 91 | }) 92 | }) 93 | 94 | 95 | 96 | 97 | module.exports = router; 98 | -------------------------------------------------------------------------------- /src/app/auth/landing-page/landing-page.component.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@600&family=Dongle&family=Open+Sans&display=swap'); 2 | 3 | body{ 4 | overflow-x: hidden; 5 | } 6 | nav{ 7 | height: 80px; 8 | } 9 | #intro-example { 10 | height: 400px; 11 | background: linear-gradient(110deg, #a73131 60%, #0c00ea 60%); 12 | border-radius: 0px 0px 230px 230px; 13 | } 14 | 15 | /* Height for devices larger than 992px */ 16 | @media (min-width: 992px) { 17 | #intro-example { 18 | height: 700px; 19 | } 20 | } 21 | #side-image { 22 | border-radius: 2cm; 23 | zoom: 80%; 24 | 25 | 26 | } 27 | .img-tag{ 28 | padding-right: 100px; 29 | padding-top: 100px; 30 | 31 | 32 | } 33 | @media (max-width: 1182px) { 34 | #side-image{ 35 | zoom:50% 36 | } 37 | } 38 | .head-1{ 39 | font-weight: 900; 40 | font-size: 60px; 41 | letter-spacing: 1px; 42 | margin-top: 150px; 43 | margin-right: 100px; 44 | } 45 | .head-2{ 46 | font-weight: 900; 47 | font-size: 60px; 48 | letter-spacing: 1px; 49 | margin-right: 100px; 50 | } 51 | .head-3{ 52 | margin-top: 40px; 53 | font-size: large; 54 | color: #807f88; 55 | 56 | } 57 | .head-4{ 58 | font-size: large; 59 | margin-right: 250px; 60 | color: #807f88; 61 | } 62 | @media (max-width: 1399px) { 63 | .head-1,.head-2{ 64 | zoom:60% 65 | } 66 | } 67 | @media (max-width: 1399px) { 68 | .head-3,.head-4{ 69 | zoom:60%; 70 | } 71 | } 72 | 73 | @media (max-width: 1399px) { 74 | .head-1{ 75 | padding-top: 200px; 76 | } 77 | } 78 | @media (max-width: 854px) { 79 | .head-1,.head-2{ 80 | zoom: 40%; 81 | } 82 | } 83 | @media (max-width: 854px) { 84 | .head-1{ 85 | margin-top: 200px; 86 | } 87 | } 88 | @media (max-width: 733px) { 89 | #side-image{ 90 | zoom: 40%; 91 | } 92 | } 93 | .mask{ 94 | border-radius: 0px 0px 0px 230px; 95 | } 96 | .head-5{ 97 | font-size: 65px; 98 | margin-top: 100px; 99 | font-weight: 500; 100 | font-family: 'Dongle', sans-serif; 101 | } 102 | .text-1{ 103 | font-family: 'Dongle', sans-serif; 104 | font-size: 30px; 105 | font-weight: 50; 106 | } 107 | .cards-1{ 108 | margin-top: 100px; 109 | align-items:center ; 110 | 111 | } 112 | .img-tag-1{ 113 | width: 40px; 114 | height: 40px; 115 | margin: auto; 116 | 117 | } 118 | .img-tag-2 { 119 | zoom: 80%; 120 | margin-top: 170px; 121 | } 122 | .head-6{ 123 | margin-top: 150px; 124 | font-size: 55px; 125 | font-family: 'Dongle', sans-serif; 126 | } 127 | .text-2{ 128 | color: #1f1b71; 129 | } 130 | .btn-1{ 131 | margin-right: 20px; 132 | } 133 | .nav-link{ 134 | font-family: 'Dongle', sans-serif; 135 | font-size: 40px; 136 | } 137 | 138 | 139 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/edit-project/edit-project.component.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Component, Inject, OnInit } from '@angular/core'; 3 | import { FormGroup, FormBuilder, Validators } from '@angular/forms'; 4 | import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; 5 | import { projectDataService } from '../projectManager.service'; 6 | import { HotToastService } from '@ngneat/hot-toast'; 7 | 8 | @Component({ 9 | selector: 'app-edit-project', 10 | templateUrl: './edit-project.component.html', 11 | styleUrls: ['./edit-project.component.scss'], 12 | }) 13 | export class EditProjectComponent implements OnInit { 14 | Developer: any[] = [] 15 | Submitter: any[] = [] 16 | 17 | public projectForm!: FormGroup; 18 | constructor( 19 | private FormBuilder: FormBuilder, 20 | @Inject(MAT_DIALOG_DATA) public UpdateData: any, 21 | public ProjectService: projectDataService, 22 | public DialogRef: MatDialogRef, 23 | public toast:HotToastService 24 | ) {} 25 | 26 | ngOnInit(): void { 27 | this.ProjectService.getDevelopers() 28 | .subscribe(result =>{ 29 | this.Developer = result 30 | }) 31 | this.ProjectService.getSubmitter() 32 | .subscribe(result =>{ 33 | this.Submitter = result 34 | }) 35 | 36 | this.projectForm = this.FormBuilder.group({ 37 | projectTitle: ['', Validators.required], 38 | projectName: ['', Validators.required], 39 | projectType: ['', Validators.required], 40 | created: ['', Validators.required], 41 | deadLine: ['', Validators.required], 42 | features: ['', Validators.required], 43 | Developer: ['', Validators.required], 44 | submitter: ['', Validators.required], 45 | }); 46 | if (this.UpdateData) { 47 | this.projectForm.controls['projectTitle'].setValue(this.UpdateData.projectTitle); 48 | this.projectForm.controls['projectName'].setValue(this.UpdateData.projectName); 49 | this.projectForm.controls['projectType'].setValue(this.UpdateData.projectType); 50 | this.projectForm.controls['created'].setValue(this.UpdateData.created); 51 | this.projectForm.controls['deadLine'].setValue(this.UpdateData.deadLine); 52 | this.projectForm.controls['features'].setValue(this.UpdateData.features); 53 | this.projectForm.controls['Developer'].setValue(this.UpdateData.Developer); 54 | this.projectForm.controls['submitter'].setValue(this.UpdateData.submitter); 55 | } 56 | } 57 | UpdateProject() { 58 | this.ProjectService.getprojectupdate( 59 | this.projectForm.value, 60 | this.UpdateData._id 61 | ).pipe(this.toast.observe({ 62 | success:'Project Updated', 63 | loading: 'Logging in....', 64 | error: 'There was an error' 65 | })) 66 | .subscribe({ 67 | next: (res) => { 68 | this.projectForm.reset(); 69 | this.DialogRef.close('update') 70 | }, 71 | }); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/app/auth/register/register.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |
7 |

Register Form

8 | 9 | Full Name 10 | 16 | User Name is required 19 | 20 | 21 | Email 22 | 28 | 29 | 30 | Email is required 31 | 32 | 33 | Please enter the valid email 34 | 35 | 36 | 37 | Mobile 38 | 44 | Mobile Number is required 47 | 48 | 49 | password 50 | 56 | 57 | Password is required 58 | 59 | 60 | Password must be of length 6 61 | 62 | 63 | 64 | Confirm password 65 | 71 | 72 | Password is required 73 | 74 | 75 | 76 | 80 | Password should match 81 | 82 | 83 |
84 | 85 | -------------------------------------------------------------------------------- /src/app/auth/auth.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from "@angular/common/http"; 3 | import { Router } from "@angular/router"; 4 | import { Subject } from "rxjs"; 5 | import { HotToastService } from '@ngneat/hot-toast'; 6 | 7 | import { AuthData,AuthDataLogin } from './auth-data.model'; 8 | 9 | 10 | 11 | @Injectable({ 12 | providedIn: 'root' 13 | }) 14 | export class AuthService { 15 | private isAuthenticated = false; 16 | private token : unknown; 17 | private tokenTimer : any; 18 | private authStatusListener = new Subject(); 19 | 20 | constructor(private http: HttpClient, private router:Router,private toast: HotToastService) { } 21 | 22 | 23 | getToken(){ 24 | return this.token 25 | } 26 | 27 | getIsAuth(){ 28 | return this.isAuthenticated; 29 | } 30 | 31 | createUser(FullName: string,email: string, mobile: number, password: string ){ 32 | const authData: AuthData = {FullName: FullName, email: email, mobile: mobile, password: password} 33 | this.http.post("http://localhost:3000/api/user/register", authData) 34 | .pipe (this.toast.observe({ 35 | success: 'Logged in successfuly', 36 | loading:'Logging in.... ', 37 | error:'The email or Phone Number already exist' 38 | })) 39 | .subscribe(response =>{ 40 | console.log(response); 41 | this.router.navigate(['/login']) 42 | 43 | }) 44 | } 45 | login(email: string, password: string){ 46 | const authDataLogin: AuthDataLogin = {email: email, password: password} 47 | this.http.post<{token: string, expiresIn: number}>("http://localhost:3000/api/user/login", authDataLogin) 48 | .pipe (this.toast.observe({ 49 | success: 'Logged in successfuly', 50 | loading:'Logging in.... ', 51 | error:'There was an error' 52 | })) 53 | .subscribe(response =>{ 54 | console.log(response); 55 | const token = response.token 56 | this.token = token; 57 | if(token){ 58 | const expiresInsDuration = response.expiresIn; 59 | this.tokenTimer = setTimeout(() => { 60 | this.logout(); 61 | }, expiresInsDuration * 1000 ); 62 | this.isAuthenticated = true; 63 | this.authStatusListener.next(true); 64 | const now = new Date(); 65 | const expirationDate = new Date (now.getTime() + expiresInsDuration *1000); 66 | console.log(expirationDate); 67 | this.saveAuthData(token, expirationDate) 68 | this.router.navigate(['/']) 69 | } 70 | }) 71 | } 72 | logout(){ 73 | this.token = null; 74 | this.isAuthenticated = false; 75 | this.authStatusListener.next(false); 76 | clearTimeout(this.tokenTimer) 77 | this.clearAuthData(); 78 | this.router.navigate(['/']) 79 | } 80 | private saveAuthData(token: string, expirationDate: Date){ 81 | localStorage.setItem('token', token); 82 | localStorage.setItem('expiration', expirationDate.toISOString()) 83 | } 84 | private clearAuthData(){ 85 | localStorage.removeItem('token') 86 | localStorage.removeItem('expiration') 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/projectManager.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from "@angular/common/http"; 3 | import { Router } from "@angular/router"; 4 | import { map, Observable, Subject } from "rxjs"; 5 | import { HotToastService } from '@ngneat/hot-toast'; 6 | 7 | import { getprojectData, projectData,userData} from "./project-data.model"; 8 | import { AuthData } from "../../../auth/auth-data.model"; 9 | 10 | 11 | @Injectable({ 12 | providedIn: 'root' 13 | }) 14 | export class projectDataService { 15 | private _ProjectDetailsToCom = new Subject(); 16 | projectDetails$ = this._ProjectDetailsToCom.asObservable(); 17 | private _url:string = 'http://localhost:3000/api/project-Manager/home'; 18 | private user_url: string = 'http://localhost:3000/api/project-Manager/alluser'; 19 | private update_project: string = 'http://localhost:3000/api/project-Manager/updateProject'; 20 | private update_user_position: string = 'http://localhost:3000/api/user/updateUser'; 21 | private get_developers: string = 'http://localhost:3000/api/project-Manager/getDevelopers' 22 | private get_Submitter: string = 'http://localhost:3000/api/project-Manager/getSubmitters' 23 | 24 | 25 | 26 | constructor(private http: HttpClient, private router: Router, private toast: HotToastService) { } 27 | 28 | createProject(projectTitle: string, 29 | projectName: string, 30 | projectType: string, 31 | created: string, 32 | deadLine: string, 33 | features: string, 34 | Developer: string, 35 | submitter: string,){ 36 | const ProjectData: projectData ={ 37 | projectTitle: projectTitle, 38 | projectName:projectName, 39 | projectType:projectType, 40 | created:created, 41 | deadLine:deadLine, 42 | features:features, 43 | Developer: Developer, 44 | submitter: submitter} 45 | this.http.post('http://localhost:3000/api/project-Manager/create-project',ProjectData) 46 | .pipe(this.toast.observe({ 47 | success:'Project Created', 48 | loading: 'Logging in....', 49 | error: 'There was an error' 50 | })) 51 | .subscribe(response =>{ 52 | console.log(response); 53 | }) 54 | } 55 | getProject(): Observable{ 56 | return this.http.get(this._url) 57 | .pipe(map(response => response)) 58 | } 59 | getUser(): Observable{ 60 | return this.http.get(this.user_url) 61 | .pipe(map(response => response)) 62 | } 63 | getprojectupdate(data: any, id: any){ 64 | return this.http.put(`${this.update_project}/${id}`, data) 65 | } 66 | updateUserPosition(position: any, userId: any){ 67 | const UserData: userData = { position: position} 68 | return this.http.put(`${this.update_user_position}/${userId}`,UserData) 69 | .subscribe(res =>{ 70 | console.log(res); 71 | }) 72 | } 73 | getDevelopers() { 74 | return this.http.get(this.get_developers) 75 | .pipe(map(response => response)) 76 | 77 | } 78 | getSubmitter() { 79 | return this.http.get(this.get_Submitter) 80 | .pipe(map(response => response)) 81 | 82 | } 83 | } 84 | 85 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/edit-project/edit-project.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Edit Project Form

4 |
5 |
6 |
7 |
8 |
9 | 10 | Project Title 11 | 13 | 14 |
15 |
16 | 17 | Project Name 18 | 20 | 21 |
22 |
23 | 24 | Project Type 25 | 27 | 28 |
29 |
30 |
31 |
32 | 33 | Created 34 | 36 | 37 |
38 |
39 | 40 | Dead Line 41 | 43 | 44 |
45 |
46 | 47 | Project Features 48 | 49 | 50 |
51 |
52 |
53 |
54 | 55 | Select Developer 56 | 57 | {{name.FullName}} 58 | 59 | 60 |
61 |
62 | 63 | Select Submitter 64 | 65 | {{sub.FullName}} 66 | 67 | 68 |
69 |
70 | 71 |
72 |
73 |
74 | 75 |
-------------------------------------------------------------------------------- /src/app/angular-material.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { OverlayModule } from '@angular/cdk/overlay'; 4 | import { CdkTreeModule } from '@angular/cdk/tree'; 5 | import { PortalModule } from '@angular/cdk/portal'; 6 | import { MatAutocompleteModule } from '@angular/material/autocomplete'; 7 | import { MatButtonModule } from '@angular/material/button'; 8 | import { MatButtonToggleModule } from '@angular/material/button-toggle'; 9 | import { MatCardModule } from '@angular/material/card'; 10 | import { MatCheckboxModule } from '@angular/material/checkbox'; 11 | import { MatChipsModule } from '@angular/material/chips'; 12 | import { MatRippleModule } from '@angular/material/core'; 13 | import { MatDividerModule } from '@angular/material/divider'; 14 | import { MatExpansionModule } from '@angular/material/expansion'; 15 | import { MatFormFieldModule } from '@angular/material/form-field'; 16 | import { MatIconModule } from '@angular/material/icon'; 17 | import { MatInputModule } from '@angular/material/input'; 18 | import { MatListModule } from '@angular/material/list'; 19 | import { MatMenuModule } from '@angular/material/menu'; 20 | import { MatPaginatorModule } from '@angular/material/paginator'; 21 | import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; 22 | import { MatSelectModule } from '@angular/material/select'; 23 | import { MatSidenavModule } from '@angular/material/sidenav'; 24 | import { MatSnackBarModule } from '@angular/material/snack-bar'; 25 | import { MatSortModule } from '@angular/material/sort'; 26 | import { MatTableModule } from '@angular/material/table'; 27 | import { MatTabsModule } from '@angular/material/tabs'; 28 | import { MatToolbarModule } from '@angular/material/toolbar'; 29 | import { MatTreeModule } from '@angular/material/tree'; 30 | import { MatBadgeModule } from '@angular/material/badge'; 31 | import { MatGridListModule } from '@angular/material/grid-list'; 32 | import { MatRadioModule } from '@angular/material/radio'; 33 | import { MatDatepickerModule } from '@angular/material/datepicker'; 34 | import { MatTooltipModule } from '@angular/material/tooltip'; 35 | import {MatProgressBarModule} from '@angular/material/progress-bar'; 36 | import {MatDialogModule} from '@angular/material/dialog'; 37 | 38 | 39 | 40 | const materialModules = [ 41 | CdkTreeModule, 42 | MatAutocompleteModule, 43 | MatButtonModule, 44 | MatCardModule, 45 | MatCheckboxModule, 46 | MatChipsModule, 47 | MatDividerModule, 48 | MatExpansionModule, 49 | MatIconModule, 50 | MatInputModule, 51 | MatListModule, 52 | MatMenuModule, 53 | MatProgressSpinnerModule, 54 | MatPaginatorModule, 55 | MatRippleModule, 56 | MatSelectModule, 57 | MatSidenavModule, 58 | MatSnackBarModule, 59 | MatSortModule, 60 | MatTableModule, 61 | MatTabsModule, 62 | MatToolbarModule, 63 | MatFormFieldModule, 64 | MatButtonToggleModule, 65 | MatTreeModule, 66 | OverlayModule, 67 | PortalModule, 68 | MatBadgeModule, 69 | MatGridListModule, 70 | MatRadioModule, 71 | MatDatepickerModule, 72 | MatTooltipModule, 73 | MatProgressBarModule, 74 | MatDialogModule 75 | ]; 76 | @NgModule({ 77 | imports: [ 78 | CommonModule, 79 | ...materialModules 80 | ], 81 | exports: [ 82 | ...materialModules 83 | ], 84 | }) 85 | export class AngularMaterialModule { } -------------------------------------------------------------------------------- /src/app/auth/register/register.component.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@600&family=Dongle&family=Open+Sans&display=swap'); 2 | 3 | *, 4 | *:before, 5 | *:after{ 6 | padding: 0; 7 | margin: 0; 8 | box-sizing: border-box; 9 | } 10 | body{ 11 | background-color: #483c54; 12 | 13 | } 14 | .background{ 15 | width: 430px; 16 | height: 520px; 17 | position: absolute; 18 | transform: translate(-50%,-50%); 19 | left: 50%; 20 | top: 50%; 21 | } 22 | .background .shape{ 23 | height: 200px; 24 | width: 200px; 25 | position: absolute; 26 | border-radius: 50%; 27 | } 28 | .shape:first-child{ 29 | background: linear-gradient( 30 | #1845ad, 31 | #23a2f6 32 | ); 33 | left: -150px; 34 | top: -80px; 35 | } 36 | .shape:last-child{ 37 | background: linear-gradient( 38 | to right, 39 | #ff512f, 40 | #f09819 41 | ); 42 | right: -150px; 43 | bottom: -80px; 44 | } 45 | form{ 46 | zoom: 80%; 47 | width: 500px; 48 | background-color: rgba(105, 168, 49, 0.13); 49 | position: absolute; 50 | transform: translate(-50%,-50%); 51 | top: 50%; 52 | left: 50%; 53 | border-radius: 10px; 54 | backdrop-filter: blur(10px); 55 | border: 2px solid rgba(255,255,255,0.1); 56 | box-shadow: 0 0 40px rgba(8,7,16,0.6); 57 | padding: 50px 35px; 58 | } 59 | form *{ 60 | font-family: 'Poppins',sans-serif; 61 | color: #ffffff; 62 | letter-spacing: 0.5px; 63 | outline: none; 64 | border: none; 65 | } 66 | form h3{ 67 | font-family: 'Dongle', sans-serif; 68 | font-size: 62px; 69 | font-weight: 500; 70 | line-height: 42px; 71 | text-align: center; 72 | } 73 | 74 | label{ 75 | display: block; 76 | margin-top: 30px; 77 | font-size: 16px; 78 | font-weight: 500; 79 | } 80 | // input{ 81 | // display: block; 82 | // height: 50px; 83 | // width: 100%; 84 | // background-color: rgba(255,255,255,0.07); 85 | // border-radius: 3px; 86 | // padding: 0 10px; 87 | // padding-right: 30px; 88 | // margin-top: 8px; 89 | // font-size: 14px; 90 | // font-weight: 300; 91 | // } 92 | // ::placeholder{ 93 | // color: #e5e5e5; 94 | // } 95 | 96 | mat-form-field{ 97 | margin-right: 30px; 98 | } 99 | 100 | button{ 101 | margin-bottom:30px ; 102 | height: 50px; 103 | margin-top: 15px; 104 | width: 50%; 105 | font-size: 15px; 106 | font-weight: 400; 107 | border-radius: 5px; 108 | cursor: pointer; 109 | } 110 | .social{ 111 | margin-top: 30px; 112 | display: flex; 113 | } 114 | .social div{ 115 | background: red; 116 | width: 150px; 117 | border-radius: 3px; 118 | padding: 5px 10px 10px 5px; 119 | background-color: rgba(255,255,255,0.27); 120 | color: #eaf0fb; 121 | text-align: center; 122 | } 123 | .social div:hover{ 124 | background-color: rgba(255,255,255,0.47); 125 | } 126 | .social .fb{ 127 | margin-left: 25px; 128 | } 129 | .social i{ 130 | margin-right: 4px; 131 | } 132 | mat-error{ 133 | color: rgb(255, 136, 0) !important; 134 | } 135 | mat-form-field { 136 | width: 80%; 137 | } 138 | .input-field{ 139 | margin-top: 20px; 140 | } 141 | .signup-link{ 142 | padding-left: 210px; 143 | padding-top: 10px; 144 | } 145 | a{ 146 | text-decoration-line: none; 147 | } 148 | .grid-1{ 149 | padding-top: 10px; 150 | } -------------------------------------------------------------------------------- /src/app/auth/login/login.component.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@600&family=Dongle&family=Open+Sans&display=swap'); 2 | 3 | *, 4 | *:before, 5 | *:after{ 6 | padding: 0; 7 | margin: 0; 8 | box-sizing: border-box; 9 | } 10 | body{ 11 | background-color: #483c54; 12 | 13 | } 14 | .background{ 15 | width: 430px; 16 | height: 520px; 17 | position: absolute; 18 | transform: translate(-50%,-50%); 19 | left: 50%; 20 | top: 50%; 21 | } 22 | .background .shape{ 23 | height: 200px; 24 | width: 200px; 25 | position: absolute; 26 | border-radius: 50%; 27 | } 28 | .shape:first-child{ 29 | background: linear-gradient( 30 | #1845ad, 31 | #23a2f6 32 | ); 33 | left: -80px; 34 | top: -80px; 35 | } 36 | .shape:last-child{ 37 | background: linear-gradient( 38 | to right, 39 | #ff512f, 40 | #f09819 41 | ); 42 | right: -30px; 43 | bottom: -80px; 44 | } 45 | form{ 46 | height: 520px; 47 | width: 400px; 48 | background-color: rgba(105, 168, 49, 0.13); 49 | position: absolute; 50 | transform: translate(-50%,-50%); 51 | top: 50%; 52 | left: 50%; 53 | border-radius: 10px; 54 | backdrop-filter: blur(10px); 55 | border: 2px solid rgba(255,255,255,0.1); 56 | box-shadow: 0 0 40px rgba(8,7,16,0.6); 57 | padding: 50px 35px; 58 | } 59 | form *{ 60 | font-family: 'Poppins',sans-serif; 61 | color: #ffffff; 62 | letter-spacing: 0.5px; 63 | outline: none; 64 | border: none; 65 | } 66 | form h3{ 67 | font-family: 'Dongle', sans-serif; 68 | font-size: 62px; 69 | font-weight: 500; 70 | line-height: 42px; 71 | text-align: center; 72 | } 73 | 74 | label{ 75 | display: block; 76 | margin-top: 30px; 77 | font-size: 16px; 78 | font-weight: 500; 79 | } 80 | // input{ 81 | // display: block; 82 | // height: 50px; 83 | // width: 100%; 84 | // background-color: rgba(255,255,255,0.07); 85 | // border-radius: 3px; 86 | // padding: 0 10px; 87 | // padding-right: 30px; 88 | // margin-top: 8px; 89 | // font-size: 14px; 90 | // font-weight: 300; 91 | // } 92 | ::placeholder{ 93 | color: #e5e5e5; 94 | } 95 | 96 | mat-form-field{ 97 | margin-right: 30px; 98 | } 99 | 100 | button{ 101 | height: 50px; 102 | margin-top: 15px; 103 | width: 80%; 104 | margin-left: 30px; 105 | font-size: 15px; 106 | font-weight: 400; 107 | border-radius: 5px; 108 | cursor: pointer; 109 | } 110 | .social{ 111 | margin-top: 30px; 112 | display: flex; 113 | } 114 | .social div{ 115 | background: red; 116 | width: 150px; 117 | border-radius: 3px; 118 | padding: 5px 10px 10px 5px; 119 | background-color: rgba(255,255,255,0.27); 120 | color: #eaf0fb; 121 | text-align: center; 122 | } 123 | .social div:hover{ 124 | background-color: rgba(255,255,255,0.47); 125 | } 126 | .social .fb{ 127 | margin-left: 25px; 128 | } 129 | .social i{ 130 | margin-right: 4px; 131 | } 132 | mat-error{ 133 | color: rgb(255, 136, 0) !important; 134 | } 135 | mat-form-field { 136 | width: 80%; 137 | } 138 | .input-field{ 139 | margin-top: 20px; 140 | } 141 | .signup-link{ 142 | padding-left: 210px; 143 | padding-top: 10px; 144 | } 145 | a{ 146 | text-decoration-line: none; 147 | } 148 | .signup-register{ 149 | font-size: smaller; 150 | 151 | } -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "Project-Management": { 7 | "projectType": "application", 8 | "schematics": { 9 | "@schematics/angular:component": { 10 | "style": "scss" 11 | } 12 | }, 13 | "root": "", 14 | "sourceRoot": "src", 15 | "prefix": "app", 16 | "architect": { 17 | "build": { 18 | "builder": "@angular-devkit/build-angular:browser", 19 | "options": { 20 | "outputPath": "dist/project-management", 21 | "index": "src/index.html", 22 | "main": "src/main.ts", 23 | "polyfills": "src/polyfills.ts", 24 | "tsConfig": "tsconfig.app.json", 25 | "inlineStyleLanguage": "scss", 26 | "assets": [ 27 | "src/favicon.ico", 28 | "src/assets" 29 | ], 30 | "styles": [ 31 | "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", 32 | "src/styles.scss" 33 | ], 34 | "scripts": [] 35 | }, 36 | "configurations": { 37 | "production": { 38 | "budgets": [ 39 | { 40 | "type": "initial", 41 | "maximumWarning": "500kb", 42 | "maximumError": "1mb" 43 | }, 44 | { 45 | "type": "anyComponentStyle", 46 | "maximumWarning": "2kb", 47 | "maximumError": "4kb" 48 | } 49 | ], 50 | "fileReplacements": [ 51 | { 52 | "replace": "src/environments/environment.ts", 53 | "with": "src/environments/environment.prod.ts" 54 | } 55 | ], 56 | "outputHashing": "all" 57 | }, 58 | "development": { 59 | "buildOptimizer": false, 60 | "optimization": false, 61 | "vendorChunk": true, 62 | "extractLicenses": false, 63 | "sourceMap": true, 64 | "namedChunks": true 65 | } 66 | }, 67 | "defaultConfiguration": "production" 68 | }, 69 | "serve": { 70 | "builder": "@angular-devkit/build-angular:dev-server", 71 | "configurations": { 72 | "production": { 73 | "browserTarget": "Project-Management:build:production" 74 | }, 75 | "development": { 76 | "browserTarget": "Project-Management:build:development" 77 | } 78 | }, 79 | "defaultConfiguration": "development" 80 | }, 81 | "extract-i18n": { 82 | "builder": "@angular-devkit/build-angular:extract-i18n", 83 | "options": { 84 | "browserTarget": "Project-Management:build" 85 | 86 | } 87 | }, 88 | "test": { 89 | "builder": "@angular-devkit/build-angular:karma", 90 | "options": { 91 | "main": "src/test.ts", 92 | "polyfills": "src/polyfills.ts", 93 | "tsConfig": "tsconfig.spec.json", 94 | "karmaConfig": "karma.conf.js", 95 | "inlineStyleLanguage": "scss", 96 | "assets": [ 97 | "src/favicon.ico", 98 | "src/assets" 99 | ], 100 | "styles": [ 101 | "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", 102 | "src/styles.scss" 103 | ], 104 | "scripts": [] 105 | } 106 | } 107 | } 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/app/modules/developer/components/dev-home/dev-home.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 | 7 |
8 |

All Projects

9 |
10 |
11 |
12 |
13 | 15 | 16 | 17 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 37 | 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 49 | 52 | 53 | 54 | 55 | 57 | 58 | 59 | 60 | 61 | 62 |
19 |

Project Title

20 |
{{element.projectTitle}} 27 |

Project Name

28 |
{{element.projectName}} 35 |

Project Type

36 |
{{element.projectType}} 43 |

Created

44 |
{{element.created | date}} 50 |

Dead Line

51 |
{{element.deadLine | date}} 56 |
63 | 64 | 67 | 68 | 69 | 70 | 71 |
72 |
73 |
74 |
75 | 76 |
77 |
78 |
79 | -------------------------------------------------------------------------------- /src/app/modules/submitter/components/sub-home/sub-home.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 | 7 |
8 |

All Projects

9 |
10 |
11 |
12 |
13 | 15 | 16 | 17 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 37 | 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 49 | 52 | 53 | 54 | 55 | 57 | 58 | 59 | 60 | 61 | 62 |
19 |

Project Title

20 |
{{element.projectTitle}} 27 |

Project Name

28 |
{{element.projectName}} 35 |

Project Type

36 |
{{element.projectType}} 43 |

Created

44 |
{{element.created | date}} 50 |

Dead Line

51 |
{{element.deadLine | date}} 56 |
63 | 64 | 67 | 68 | 69 | 70 | 71 |
72 |
73 |
74 |
75 | 76 |
77 |
78 |
79 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/create-project/create-project.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 | 7 |

Create New Project

8 |

Add project details

9 |
10 |
11 |
12 |

13 |
14 |
15 |
16 |

17 | 18 | Project Title 19 | 23 | bookmark 24 | Project Title is required 26 | 27 |

28 |
29 |
30 |

31 | 32 | Project Name 33 | 36 | remove_from_queue 37 | Project name is required 39 | 40 |

41 |
42 |

43 | 44 | Project Type 45 | 48 | keyboard 49 | project type is required 51 | 52 |

53 |
54 |
55 |
56 |

57 | 58 | Created 59 | 61 | event_available 62 | select project created date 64 | 65 |

66 |
67 |
68 |

69 | 70 | Dead Line 71 | 73 | event_busy 74 | define the deadline of the project 76 | 77 |

78 |
79 |
80 | 81 | Project Features 82 | 83 | specify the customer requirement to the project 85 | 86 |
87 |
88 |
89 |
90 | 91 | Select Developer 92 | 93 | {{name.FullName}} 94 | 95 | assing developers to the project 97 | 98 |
99 |
100 | 101 | Select 102 | 103 | {{sub.FullName}} 104 | 105 | assing submitter to the project 107 |
108 |
109 |
110 |
111 |
112 | 113 |
114 |
115 |
116 | 117 | 118 | -------------------------------------------------------------------------------- /src/app/modules/project-manager/components/home/home.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 |
6 |
7 | 8 |
9 |
10 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | 26 |
27 | 32 |
33 |

34 | 35 | Search Project 36 | 37 | youtube_searched_for 38 | 39 |

40 |
41 |
42 |

My project

43 |
44 |
45 |
46 |
47 |
48 |
49 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 62 | 65 | 66 | 67 | 68 | 69 | 70 | 73 | 74 | 75 | 76 | 77 | 78 | 81 | 82 | 83 | 84 | 85 | 88 | 89 | 90 | 91 | 94 | 95 | 96 | 97 | 99 | 100 | 101 | 102 | 104 | 105 | 106 | 107 | 108 | 109 |
55 | Project Title 56 | {{element.projectTitle}} 63 | Project Name 64 | {{element.projectName}} 71 | Project Type 72 | {{element.projectType}} 79 | Created 80 | {{element.created | date}} 86 | Dead Line 87 | {{element.deadLine | date}} 92 | Status 93 | {{element.Status}} 98 | 103 |
110 | 111 | 114 | 115 | 116 | 117 | 118 |
119 |
120 |
121 | 122 |
123 |
124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /src/app/auth/landing-page/landing-page.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 62 | 63 | 64 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | 76 |
77 |
78 |
79 |

Manage Your Project

80 |
81 |

Smart & Faster

82 |
A smart & Faster office is a workplace where technology enables people to
83 |
work better, faster and, of course, smarter.
84 |
85 |
86 |
87 |
88 |
89 |
90 | 91 |
92 |

We Providing Our Best Services

93 |

This feature is essential for any mobile app, so make sure you have it!
These types of notifications can directly alert your user.

94 |
95 |
96 |
97 |
98 |
99 | Sunset Over the Sea 100 |
101 |

Some quick example text to build on the card title and make up the bulk of the card's content.

102 |
103 |
104 |
105 |
106 |
107 | Sunset Over the Sea 108 |
109 |

Some quick example text to build on the card title and make up the bulk of the card's content.

110 |
111 |
112 |
113 |
114 |
115 | Sunset Over the Sea 116 |
117 |

Some quick example text to build on the card title and make up the bulk of the card's content.

118 |
119 |
120 |
121 |
122 |
123 | 124 |
125 |
126 |
127 |
128 | Sunset Over the Sea 129 |
130 |

Some quick example text to build on the card title and make up the bulk of the card's content.

131 |
132 |
133 |
134 |
135 |
136 | Sunset Over the Sea 137 |
138 |

Some quick example text to build on the card title and make up the bulk of the card's content.

139 |
140 |
141 |
142 |
143 |
144 | Sunset Over the Sea 145 |
146 |

Some quick example text to build on the card title and make up the bulk of the card's content.

147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 | 155 |
156 |
157 |

Developers Most Favourite Software

158 |

This feature is essential for any Developers,
and can be converted this Software in to comapanys sitvations

159 |

Clean User Interface

160 |

Easy To Use

161 |

Best Performence

162 |

Highly Secure

163 |

Strong Secured Data Storage

164 |
165 |
166 | 167 | 168 | 169 | 170 | 171 | --------------------------------------------------------------------------------