Commit c08bb819 authored by hasan khaddour's avatar hasan khaddour

add main domains services

parent e65d8523
...@@ -15,7 +15,7 @@ export class JwtInterceptor implements HttpInterceptor { ...@@ -15,7 +15,7 @@ export class JwtInterceptor implements HttpInterceptor {
if (token) { if (token) {
request = request.clone({ request = request.clone({
setHeaders: { setHeaders: {
Authorization: `Bearer ${token}` Authorization: `Bearer ${token.trim()}`
} }
}); });
} }
......
...@@ -30,14 +30,10 @@ export class CustomerCreateComponent { ...@@ -30,14 +30,10 @@ export class CustomerCreateComponent {
this.customerService.createCustomer(request) this.customerService.createCustomer(request)
.subscribe({ .subscribe({
next : (res)=>{ next : (res)=>{
if(res.isSuccess){
this.toastr.success("تمت إضافة الجهة بنجاح");
this.toastr.success("تمت إضافة الجهة بنجاح"); this.router.navigate(['customers/detail', res.id]);
this.router.navigate(['customers/detail', res.value.id]);
}else {
this.toastr.error(res.validationErrors[0].errorMessage);
}
} }
, ,
error : (err)=>this.toastr.error("An error Occured") error : (err)=>this.toastr.error("An error Occured")
......
...@@ -25,15 +25,9 @@ export class CustomerDetailsComponent implements OnInit { ...@@ -25,15 +25,9 @@ export class CustomerDetailsComponent implements OnInit {
const id = Number(this.route.snapshot.paramMap.get('id')); const id = Number(this.route.snapshot.paramMap.get('id'));
this.customerService.getCustomerById(id).subscribe({ this.customerService.getCustomerById(id).subscribe({
next :(data) => { next :(data) => {
console.log(data.validationErrors)
this.customer = data;
if(data.isSuccess){
this.customer = data.value;
}else {
this.toastr.error(data.validationErrors[0].errorMessage);
// this.router()
}
}, },
error : (err)=>{ console.log(err)} error : (err)=>{ console.log(err)}
......
...@@ -44,19 +44,13 @@ export class CustomerListComponent implements OnInit { ...@@ -44,19 +44,13 @@ export class CustomerListComponent implements OnInit {
this.customerService.getCustomers().subscribe({ this.customerService.getCustomers().subscribe({
next : (res) =>{ next : (res) =>{
console.log(res); console.log(res);
if(res.isSuccess){ this.toastr.success('تم تحميل الجهات الطارجة بنجاح');
this.toastr.success('تم تحميل الجهات الطارجة بنجاح'); this.customers = res;
this.customers = res.value;
}else {
this.toastr.error(res.errors[0],"error");
}
this.loadingService.hide(); this.loadingService.hide();
}, },
error: (err)=>{ error: (err)=>{
this.toastr.error('Failed to load customers'); this.toastr.error('لقد حدث خطاء ما ');
this.loadingService.hide(); this.loadingService.hide();
} }
......
...@@ -13,24 +13,24 @@ export class CustomerService { ...@@ -13,24 +13,24 @@ export class CustomerService {
constructor(private http :HttpClient ,private config : ConfigurationService) { } constructor(private http :HttpClient ,private config : ConfigurationService) { }
public getCustomers():Observable<Result<Customer[]>>{ public getCustomers():Observable<Customer[]>{
return this.http.get<Result<Customer[]>>(this.config.getServerUrl()+ "/Customers"); return this.http.get<Customer[]>(this.config.getServerUrl()+ "/Customers");
} }
public getCustomerById(id : number ):Observable<Result<Customer>>{ public getCustomerById(id : number ):Observable<Customer>{
return this.http.get<Result<Customer>>(this.config.getServerUrl()+ "/Customers/"+id); return this.http.get<Customer>(this.config.getServerUrl()+ "/Customers/"+id);
} }
public createCustomer(customer :CreateCustomerRequest):Observable<Result<Customer>>{ public createCustomer(customer :CreateCustomerRequest):Observable<Customer>{
return this.http.post<Result<Customer>>(this.config.getServerUrl()+ "/Customers",customer); return this.http.post<Customer>(this.config.getServerUrl()+ "/Customers",customer);
} }
public updateCustomer(id :number ,customer :Customer):Observable<Result<void>>{ public updateCustomer(id :number ,customer :Customer):Observable<void>{
return this.http.put<Result<void>>(`${this.config.getServerUrl()}/Customers/${id}` ,customer); return this.http.put<void>(`${this.config.getServerUrl()}/Customers/${id}` ,customer);
} }
public deleteCustomer(id: number): Observable<void> { public deleteCustomer(id: number): Observable<void> {
......
import { Availability } from "../vakueObjects/Availability" import { Availability } from "../vakueObjects/availability"
import { PersonalInfo } from "../vakueObjects/personalInfo" import { PersonalInfo } from "../vakueObjects/personalInfo"
import { WorkInfo } from "../vakueObjects/WorkInfo" import { WorkInfo } from "../vakueObjects/workInfo"
export class Employee { export class Employee {
id:number id:number
hiastId :number hiastId :number
userId :number userId :number
email : string
departmentName :string departmentName :string
personalInfo :PersonalInfo personalInfo :PersonalInfo
availability :Availability availability :Availability
......
...@@ -24,34 +24,40 @@ export class EmployeesService { ...@@ -24,34 +24,40 @@ export class EmployeesService {
} }
public getEmployeeById(id : number ):Observable<Result<Employee>>{ public getEmployeeById(id : number ):Observable<Employee>{
return this.http.get<Result<Employee>>(this.config.getServerUrl()+ "/Employees/"+id); return this.http.get<Employee>(this.config.getServerUrl()+ "/Employees/"+id);
} }
public getCurrentEmployee( ):Observable<Result<Employee>>{
public getCurrentEmployee( ):Observable<Employee>{
let id = this.userService.getEmployeeId(); let id = this.userService.getEmployeeId();
return this.getEmployeeById(id); return this.getEmployeeById(id);
} }
public getAvailableEmployees( ):Observable<Result<Employee[]>>{ public getByFilter(email : string ):Observable<Employee[]>{
return this.http.get<Employee[]>(`${this.config.getServerUrl()}/Employees/ByFilter/?email=${email}`);
}
public getAvailableEmployees( ):Observable<Employee[]>{
//this api endpoint take a pagination , i'll use i later //this api endpoint take a pagination , i'll use i later
return this.http.get<Result<Employee[]>>(this.config.getServerUrl + "/Employees/Available"); return this.http.get<Employee[]>(this.config.getServerUrl() + "/Employees/Available");
} }
public getEmployeeParticipations(id :number ):Observable<Result<EmployeeParticipate[]>>{ public getEmployeeParticipations(id :number ):Observable<EmployeeParticipate[]>{
return this.http.get<Result<EmployeeParticipate[]>>(`${this.config.getServerUrl}/Employees/EmployeeParticipations/employeeId=${id}`); return this.http.get<EmployeeParticipate[]>(`${this.config.getServerUrl}/Employees/EmployeeParticipations/employeeId=${id}`);
} }
public getMyParticipation( ):Observable<Result<EmployeeParticipate[]>>{ public getMyParticipation( ):Observable<EmployeeParticipate[]>{
let id = this.userService.getEmployeeId(); let id = this.userService.getEmployeeId();
return this.getEmployeeParticipations(id); return this.getEmployeeParticipations(id);
} }
public getEmployeeTrackHistory( request: GetEmployeeTrackHistoryRequest):Observable<Result<EmployeeTrack[]>>{ public getEmployeeTrackHistory( request: GetEmployeeTrackHistoryRequest):Observable<EmployeeTrack[]>{
let pagination='' let pagination=''
if(request.pageSize && request.pageNumber){ if(request.pageSize && request.pageNumber){
pagination = `&pageSize=${request.pageSize}&pageNumber=${request.pageNumber}` pagination = `&pageSize=${request.pageSize}&pageNumber=${request.pageNumber}`
...@@ -60,26 +66,26 @@ export class EmployeesService { ...@@ -60,26 +66,26 @@ export class EmployeesService {
let query =`employeeId=${request.employeeId}&projectId=${request.projectId}${pagination}` let query =`employeeId=${request.employeeId}&projectId=${request.projectId}${pagination}`
return this return this
.http .http
.get<Result<EmployeeTrack[]>>( .get<EmployeeTrack[]>(
`${this.config.getServerUrl}/Employees/TrackHistory/?${query}` `${this.config.getServerUrl}/Employees/TrackHistory/?${query}`
); );
} }
public getMyTrackHistory(projectId : number):Observable<Result<EmployeeTrack[]>>{ public getMyTrackHistory(projectId : number):Observable<EmployeeTrack[]>{
let query =`employeeId=${this.userService.getEmployeeId()}&projectId=${projectId}` let query =`employeeId=${this.userService.getEmployeeId()}&projectId=${projectId}`
return this return this
.http .http
.get<Result<EmployeeTrack[]>>( .get<EmployeeTrack[]>(
`${this.config.getServerUrl}/Employees/TrackHistory/?${query}` `${this.config.getServerUrl}/Employees/TrackHistory/?${query}`
); );
} }
public postEmployeeWorkHours( request: UpdateEmplyeeWorkHours):Observable<Result<void>>{ public postEmployeeWorkHours( request: UpdateEmplyeeWorkHours):Observable<void>{
return this return this
.http .http
.post<Result<void>>( .post<void>(
`${this.config.getServerUrl}/Employees/UpdateWorkHours/`, `${this.config.getServerUrl}/Employees/UpdateWorkHours/`,
request request
); );
......
<div class="pagetitle"> <div class="row gy-4 align-items-center py-5 features-item">
<h1>Dashboard</h1> <div class="col-md-5 d-flex align-items-center aos-init aos-animate" data-aos="zoom-out" data-aos-delay="100">
<nav> <img src="assets/images/home/features-2.png" class="img-fluid" alt="">
<ol class="breadcrumb"> </div>
<li class="breadcrumb-item"><a href="index.html">Home</a></li> <div class="col-md-7 aos-init aos-animate" data-aos="fade-up" data-aos-delay="100">
<li class="breadcrumb-item active">Dashboard</li> <h3>
</ol> مرحبا بك في موقع إدارة حالة المشاريع
</nav> </h3>
</div> <p class="fst-italic">
<section class="section dashboard"> تابع مشاريعك بسهولة واستعرض ساعات عملك
workkkk </p>
<h1 i18n="@@appTitle">My Awesome App</h1>
</section> <p class="fst-italic">
\ No newline at end of file
</p>
<ul>
<li><i class="bi bi-check"></i><span> تستطيع من خلال هذا الموقع الاطلاع على المشاريع التي تديرها ومتابعتها </span></li>
<li><i class="bi bi-check"></i> <span>كما يمكنك الاطلاع على ساعات عملك ضمن المشاريع التي تساهم بها</span></li>
<li><i class="bi bi-check"></i> <span>أصدر التقارير التي تحتاجها</span></li>
</ul>
</div>
</div>
\ No newline at end of file
...@@ -16,11 +16,11 @@ ...@@ -16,11 +16,11 @@
<label for="inputPassword" class="sr-only">Password</label> <label for="inputPassword" class="sr-only">Password</label>
<input type="password" id="inputPassword"name="password" [(ngModel)]="loginRequest.passWord" class="form-control form-control-lg" placeholder="Password" required=""> <input type="password" id="inputPassword"name="password" [(ngModel)]="loginRequest.passWord" class="form-control form-control-lg" placeholder="Password" required="">
</div> </div>
<div class="checkbox mb-3"> <!-- <div class="checkbox mb-3">
<label> <label>
<input type="checkbox" value="remember-me"> Stay logged in </label> <input type="checkbox" value="remember-me"> Stay logged in </label>
</div> </div> -->
<button class="btn btn-primary btn-block" (click)="onLogin()">Let me in</button> <button class="btn btn-primary btn-block" (click)="onLogin()">Let me in</button>
<p class="mt-5 mb-3 text-muted">© 2024</p> <p class="mt-5 mb-3 text-muted">© 2024</p>
......
import { Aggreement } from "../valueObjects/Aggreement" import { Aggreement } from "../valueObjects/Aggreement"
import { FinancialFund } from "../valueObjects/FinancialFund" import { FinancialFund } from "../valueObjects/FinancialFund"
import { ProjectClassification } from "../valueObjects/ProjectClassification"
import { ProjectInfo } from "../valueObjects/ProjectInfo" import { ProjectInfo } from "../valueObjects/ProjectInfo"
import { ProposalInfo } from "../valueObjects/proposalInfo" import { ProposalInfo } from "../valueObjects/proposalInfo"
...@@ -8,8 +9,39 @@ export class CreateProjectRequest { ...@@ -8,8 +9,39 @@ export class CreateProjectRequest {
proposalInfo :ProposalInfo proposalInfo :ProposalInfo
projectAggreement :Aggreement projectAggreement :Aggreement
financialFund :FinancialFund financialFund :FinancialFund
projectClassification :ProjectClassification
teamLeaderId :number teamLeaderId :number
projectManagerId :number projectManagerId :number
proposerId :number proposerId :number
executerId :number executerId :number
constructor(){
this.projectAggreement= {
aggreementDate :new Date(),
aggreementNumber:0
}
this.financialFund= {
source:'',
financialStatus :''
};
this.projectClassification = {
projectNature :'',
projectStatus:'',
projectType:''
}
this.projectInfo ={
name :'',
description:'',
code :'',
startDate : new Date(),
expectedEndDate :new Date ()
}
this.proposalInfo ={
proposingBookDate: new Date(),
proposingBookNumber:0
}
}
} }
\ No newline at end of file
export class Department {
id: number;
name: String;
}
...@@ -5,6 +5,8 @@ import { Aggreement } from "../valueObjects/Aggreement" ...@@ -5,6 +5,8 @@ import { Aggreement } from "../valueObjects/Aggreement"
import { FinancialFund } from "../valueObjects/FinancialFund" import { FinancialFund } from "../valueObjects/FinancialFund"
import { ProjectInfo } from "../valueObjects/ProjectInfo" import { ProjectInfo } from "../valueObjects/ProjectInfo"
import { ProposalInfo } from "../valueObjects/proposalInfo" import { ProposalInfo } from "../valueObjects/proposalInfo"
import { ProjectClassification } from "../valueObjects/ProjectClassification"
import { Department } from "./Department"
import { Step } from "./Step" import { Step } from "./Step"
export class Project export class Project
...@@ -13,17 +15,17 @@ export class Project ...@@ -13,17 +15,17 @@ export class Project
proposalInfo : ProposalInfo proposalInfo : ProposalInfo
projectInfo :ProjectInfo projectInfo :ProjectInfo
currentState: string currentState: string
projectClassification :ProjectClassification
projectAggreement :Aggreement projectAggreement :Aggreement
teamLeaderId: number teamLeaderId: number
teamLeader :Employee teamLeader :Employee
projectManagerId:number projectManagerId:number
projectManager: Employee projectManager: Employee
executer: { executer:Department
name :string
}
proposerId:number proposerId:number
proposer:Customer proposer:Customer
steps :Step[] steps :Step[]
employeeParticipates:EmployeeParticipate[] employeeParticipates:EmployeeParticipate[]
financialFund:FinancialFund financialFund:FinancialFund
} }
export interface ProjectClassification {
projectStatus: string;
projectType: string;
projectNature: string;
}
...@@ -2,3 +2,4 @@ export interface ProposalInfo{ ...@@ -2,3 +2,4 @@ export interface ProposalInfo{
proposingBookNumber :number proposingBookNumber :number
proposingBookDate : Date proposingBookDate : Date
} }
:host {
display: flex;
flex-direction: column;
align-items: flex-start;
}
\ No newline at end of file
<form [formGroup]="projectForm"> <div class="card col-10">
<mat-form-field> <div class="card-body">
<input type="text" matInput placeholder="Project Manager" [formControl]="projectManagerControl" [matAutocomplete]="auto"> <h5 class="card-title text-center">طرح مشروع جديد</h5>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let employee of filteredEmployees | async" [value]="employee.value.personalInfo.firstName"> <!-- Multi Columns Form -->
{{ employee.name }} <form class="row g-3" [formGroup]="projectForm" (ngSubmit)="onSubmit(request)">
</mat-option> <div class="row">
</mat-autocomplete> <mat-form-field class="col-4">
</mat-form-field> <input type="text" placeholder="مدير المشروع" formControlName="projectManager" matInput [matAutocomplete]="autoPM">
</form> <mat-autocomplete #autoPM="matAutocomplete" (optionSelected)="onManagerSelected($event.option.value)">
<mat-option *ngFor="let manager of filteredManagers | async" [value]="manager">
\ No newline at end of file {{ manager.personalInfo | fullname }} , {{manager.email}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<!-- Team Leader -->
<mat-form-field class="col-4">
<input type="text" placeholder="رئيس فريق العمل" formControlName="teamLeader" matInput [matAutocomplete]="autoTL">
<mat-autocomplete #autoTL="matAutocomplete" (optionSelected)="onLeaderSelected($event.option.value)">
<mat-option *ngFor="let leader of filteredLeaders | async" [value]="leader">
{{ leader.personalInfo | fullname }} , {{leader.email}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<!-- Customer -->
<mat-form-field class="col-4">
<input type="text" placeholder="الجهة الطارحة" formControlName="customer" matInput [matAutocomplete]="autoCustomer">
<mat-autocomplete #autoCustomer="matAutocomplete" (optionSelected)="onCustomerSelected($event.option.value)">
<mat-option *ngFor="let customer of filteredCustomers | async" [value]="customer">
{{ customer.customerName }} , {{customer.email}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</div>
<hr>
<div class="row mb-4" formGroupName="projectInfo">
<div class="col-4">
<mat-form-field class="example-full-width">
<mat-label for="name" class="form-label">اسم النشاط</mat-label>
<input matInput formControlName="name" [value]="request.projectInfo.name" placeholder="اسم المشروع" class="form-control" id="name">
</mat-form-field>
</div>
<div class="col-8 ">
<label for="description" class="form-label">الوصف</label>
<textarea formControlName="description" placeholder="تعريف النشاط " class="form-control"></textarea>
</div>
</div>
<div class="row" formGroupName="projectInfo">
<div class="col-4">
<label for="code" class="form-label">رمز المشروع</label>
<input formControlName="code" class="form-control" id="code">
</div>
<div class="col-4">
<label for="endDate" class="form-label">تاريخ النهاية المتوقع</label>
<input type="date" formControlName="expectedEndDate" class="form-control" id="endDate">
</div>
<div class="col-4">
<label for="startDate" class="form-label">تاريخ البداية</label>
<input type="date" formControlName="startDate" class="form-control" id="startDate">
</div>
</div>
<div class="row " formGroupName="financialFund">
<div class="col-4">
<label for="source" class="form-label">مصدر التمويل</label>
<input formControlName="source" class="form-control" id="source">
</div>
<div class="col-4">
<label for="financialStatus" class="form-label">وضع التمويل</label>
<input formControlName="financialStatus" class="form-control" id="financialStatus">
</div>
</div>
<div class="row" formGroupName="projectAggreement">
<div class="col-4">
<mat-form-field>
<mat-label>تاريخ كتاب الموافقة</mat-label>
<input matInput [matDatepicker]="picker">
<mat-hint>MM/DD/YYYY</mat-hint>
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
</div>
<div class="col-4">
<label for="aggreementNumber" class="form-label">رقم كتاب الموافقة</label>
<input formControlName="aggreementNumber" class="form-control" id="aggreementNumber">
</div>
</div>
<div class="col-4" formGroupName="executerId">
<mat-form-field>
<mat-label>الفعالية المنفذة </mat-label>
<mat-select>
<mat-option value="1">قسم المعلوميات</mat-option>
<mat-option value="2">قسم النظم الاكترونية</mat-option>
</mat-select>
</mat-form-field>
</div>
<div class="row" formGroupName="projectClassification">
<div class="col-4">
<label for="projectStatus" class="form-label">وضع النشاط</label>
<input formControlName="projectStatus" class="form-control" id="projectStatus">
</div>
<div class="col-4">
<label for="projectNature" class="form-label">طبيعة النشاط</label>
<input formControlName="projectNature" class="form-control" id="projectNature">
</div>
<div class="col-4">
<label for="projectType" class="form-label">نوع النشاط</label>
<input formControlName="projectType" class="form-control" id="projectType">
</div>
</div>
<hr>
<div class="text-center">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form><!-- End Multi Columns Form -->
</div>
</div>
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { EmployeesService } from '../../../employees/services/employees.service'; import { EmployeesService } from '../../../employees/services/employees.service';
import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { debounceTime, distinctUntilChanged, Observable, switchMap } from 'rxjs'; import { debounceTime, distinctUntilChanged, map, Observable, startWith, switchMap } from 'rxjs';
import { Employee } from '../../../employees/models/responses/employee'; import { Employee } from '../../../employees/models/responses/employee';
import { Result } from '../../../core/models/result'; import { Result } from '../../../core/models/result';
import { Project } from '../../models/responses/project';
import { Customer } from '../../../customers/models/customer';
import { CustomerService } from '../../../customers/services/customer.service';
import { CreateProjectRequest } from '../../models/requests/createProjectRequest';
@Component({ @Component({
selector: 'project-create', selector: 'project-create',
...@@ -12,25 +16,103 @@ import { Result } from '../../../core/models/result'; ...@@ -12,25 +16,103 @@ import { Result } from '../../../core/models/result';
}) })
export class ProjectCreateComponent { export class ProjectCreateComponent {
projectForm: FormGroup; projectForm: FormGroup;
filteredEmployees: any[] = []; filteredManagers: Observable<Employee[]>;
filteredLeaders: Observable<Employee[]>;
filteredCustomers: Observable<Customer[]>;
constructor(private employeeService: EmployeesService) {} projectManager :Employee
teamLeader :Employee
proposer :Customer
request = new CreateProjectRequest()
constructor(
private fb: FormBuilder,
private employeeService: EmployeesService,
private customersService : CustomerService
) {}
ngOnInit(): void { ngOnInit(): void {
this.projectForm = new FormGroup({ this.request= new CreateProjectRequest();
projectName: new FormControl(''),
projectManager: new FormControl('') this.projectForm = this.fb.group({
projectManager: [''],
teamLeader: [''],
customer: [''],
projectInfo: this.fb.group({
name: [''],
description: [''],
code: ['', Validators.required],
startDate: ['', Validators.required],
expectedEndDate: ['', Validators.required],
}),
financialFund: this.fb.group({
source: ['', Validators.required],
financialStatus: ['', Validators.required],
}),
projectAggreement: this.fb.group({
aggreementDate: ['', Validators.required],
aggreementNumber: ['', Validators.required],
}),
proposalInfo: this.fb.group({
// Add any fields needed here
}),
projectClassification: this.fb.group({
projectStatus: ['', Validators.required],
projectNature: ['', Validators.required],
projectType: ['', Validators.required],
}),
executerId: ['', Validators.required],
});
console.log(this.request)
this.projectForm.valueChanges.subscribe(values => {
this.request = {
...this.request, // Preserve other properties
...values, // Overwrite properties with form values
projectInfo: { ...this.request.projectInfo, ...values.projectInfo },
financialFund: { ...this.request.financialFund, ...values.financialFund },
projectAggreement: { ...this.request.projectAggreement, ...values.projectAggreement },
projectClassification: { ...this.request.projectClassification, ...values.projectClassification },
};
}); });
// Autocomplete for Project Manager
this.filteredManagers = this.projectForm.get('projectManager')!.valueChanges.pipe(
debounceTime(300),
switchMap(value => this.employeeService.getByFilter(value))
);
// Autocomplete for Team Leader
this.filteredLeaders = this.projectForm.get('teamLeader')!.valueChanges.pipe(
debounceTime(300),
switchMap(value => this.employeeService.getByFilter(value))
);
// Autocomplete for Customer
this.filteredCustomers = this.projectForm.get('customer')!.valueChanges.pipe(
debounceTime(300),
switchMap(value => this.customersService.getCustomers())
);
}
onManagerSelected(manager: Employee) {
this.projectManager = manager;
this.request.projectManagerId = manager.id;
this.projectForm.get('projectManager')!.setValue(manager.personalInfo.firstName+" " + manager.personalInfo.lastName +" , "+manager.email , { emitEvent: false });
}
onLeaderSelected(leader: Employee) {
this.teamLeader = leader;
this.request.teamLeaderId = leader.id;
this.projectForm.get('teamLeader')!.setValue(leader.personalInfo.firstName+" " + leader.personalInfo.lastName +" , "+leader.email , { emitEvent: false });
}
// Watch the projectManager field for changes and fetch matching employees onCustomerSelected(customer: Customer) {
this.projectForm.get('projectManager').valueChanges.pipe( this.proposer = customer;
debounceTime(300), // Wait for user to stop typing this.request.proposerId = customer.id;
switchMap(value => this.employeeService.getAvailableEmployees()) // Call the service this.projectForm.get('customer')!.setValue(customer.customerName, { emitEvent: false });
).subscribe(employees => this.filteredEmployees = employees.value);
} }
selectManager(employee: any): void { onSubmit(request : CreateProjectRequest){
this.projectForm.get('projectManager').setValue(employee.fullName); console.log(request);
this.filteredEmployees = [];
} }
} }
...@@ -24,15 +24,9 @@ export class ProjectDetailsComponent implements OnInit { ...@@ -24,15 +24,9 @@ export class ProjectDetailsComponent implements OnInit {
const id = Number(this.route.snapshot.paramMap.get('id')); const id = Number(this.route.snapshot.paramMap.get('id'));
this.projectService.getProjectById(id).subscribe({ this.projectService.getProjectById(id).subscribe({
next :(data) => { next :(data) => {
console.log(data.validationErrors)
this.project = data;
if(data.isSuccess){
this.project = data.value;
}else {
this.toastr.error(data.validationErrors[0].errorMessage);
// this.router()
}
}, },
error : (err)=>{ console.log(err)} error : (err)=>{ console.log(err)}
......
...@@ -33,11 +33,10 @@ export class ProjectListComponent implements OnInit{ ...@@ -33,11 +33,10 @@ export class ProjectListComponent implements OnInit{
.subscribe( .subscribe(
{ {
next: (res)=>{ next: (res)=>{
if(res.isSuccess){
this.projects = res.value; this.projects = res;
this.toastr.success("تم تحميل المشاريع بنجاح"); this.toastr.success("تم تحميل المشاريع بنجاح");
}
}, },
error: (err)=>{ error: (err)=>{
this.toastr.error("لقد حدث خظاء ما"); this.toastr.error("لقد حدث خظاء ما");
......
...@@ -2,11 +2,13 @@ import { NgModule } from '@angular/core'; ...@@ -2,11 +2,13 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
import { ProjectListComponent } from './pages/project-list/project-list.component'; import { ProjectListComponent } from './pages/project-list/project-list.component';
import { ProjectDetailsComponent } from './pages/project-details/project-details.component'; import { ProjectDetailsComponent } from './pages/project-details/project-details.component';
import { ProjectCreateComponent } from './pages/project-create/project-create.component';
const routes: Routes = [ const routes: Routes = [
{path:'',component :ProjectListComponent}, {path:'',component :ProjectListComponent},
{ path: 'detail/:id', component: ProjectDetailsComponent }, { path: 'detail/:id', component: ProjectDetailsComponent },
{ path: 'create', component: ProjectCreateComponent }
]; ];
......
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { ProjectItemComponent } from './components/project-item/project-item.component'; import { ProjectItemComponent } from './components/project-item/project-item.component';
import { AttachmentComponent } from './components/attachment/attachment.component'; import { AttachmentComponent } from './components/attachment/attachment.component';
import { ProjectListComponent } from './pages/project-list/project-list.component'; import { ProjectListComponent } from './pages/project-list/project-list.component';
import { ProjectDetailsComponent } from './pages/project-details/project-details.component'; import { ProjectDetailsComponent } from './pages/project-details/project-details.component';
import { FormControl, FormsModule } from '@angular/forms'; import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { SharedModule } from '../shared/shared.module'; import { SharedModule } from '../shared/shared.module';
import { ProjectRoutingModule } from './project-routing.module'; import { ProjectRoutingModule } from './project-routing.module';
import { StepRowItemComponent } from './components/step-row-item/step-row-item.component'; import { StepRowItemComponent } from './components/step-row-item/step-row-item.component';
import { ProjectHeaderComponent } from './components/project-header/project-header.component'; import { ProjectHeaderComponent } from './components/project-header/project-header.component';
import { ProjectCreateComponent } from './pages/project-create/project-create.component'; import { ProjectCreateComponent } from './pages/project-create/project-create.component';
import { MatCommonModule, MatOption } from '@angular/material/core'; import { MatCommonModule, MatOption, MatOptionModule } from '@angular/material/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import {MatAutocompleteModule} from '@angular/material/autocomplete'; import {MatAutocompleteModule} from '@angular/material/autocomplete';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { ProjectService } from './services/project.service'; import { ProjectService } from './services/project.service';
import {MatSelectModule} from '@angular/material/select';
import {MatDatepickerModule} from '@angular/material/datepicker';
import {provideNativeDateAdapter} from '@angular/material/core';
@NgModule({ @NgModule({
declarations: [ declarations: [
...@@ -30,7 +31,8 @@ import { ProjectService } from './services/project.service'; ...@@ -30,7 +31,8 @@ import { ProjectService } from './services/project.service';
ProjectCreateComponent ProjectCreateComponent
], ],
providers: [ providers: [
ProjectService ProjectService,
provideNativeDateAdapter()
], ],
exports:[ exports:[
ProjectRoutingModule ProjectRoutingModule
...@@ -38,14 +40,16 @@ import { ProjectService } from './services/project.service'; ...@@ -38,14 +40,16 @@ import { ProjectService } from './services/project.service';
imports: [ imports: [
CommonModule, CommonModule,
FormsModule, FormsModule,
BrowserAnimationsModule,
MatFormFieldModule, MatFormFieldModule,
FormControl, MatCommonModule,
MatOption, MatSelectModule,
MatOptionModule,
MatAutocompleteModule, MatAutocompleteModule,
MatDatepickerModule,
MatInputModule, MatInputModule,
ReactiveFormsModule ,
SharedModule SharedModule
], ]
schemas:[CUSTOM_ELEMENTS_SCHEMA ]
}) })
export class ProjectsModule { } export class ProjectsModule { }
...@@ -12,14 +12,14 @@ export class ProjectService { ...@@ -12,14 +12,14 @@ export class ProjectService {
constructor(private http :HttpClient ,private config : ConfigurationService) { } constructor(private http :HttpClient ,private config : ConfigurationService) { }
public getByFilter():Observable<Result<Project[]>>{ public getByFilter():Observable<Project[]>{
return this.http.get<Result<Project[]>>(this.config.getServerUrl()+ "/Projects/ByFilter"); return this.http.get<Project[]>(this.config.getServerUrl()+ "/Projects/ByFilter");
} }
public getProjectById(id : number ):Observable<Result<Project>>{ public getProjectById(id : number ):Observable<Project>{
return this.http.get<Result<Project>>(this.config.getServerUrl()+ "/Projects/"+id); return this.http.get<Project>(this.config.getServerUrl()+ "/Projects/"+id);
} }
} }
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-arrow profile"> <ul class="dropdown-menu dropdown-menu-end dropdown-menu-arrow profile">
<li class="dropdown-header"> <li class="dropdown-header">
<h6>Kevin Anderson</h6> <h6>{{fullName}}</h6>
<span>Team Leader</span> <span>موظف</span>
</li> </li>
<li> <li>
<hr class="dropdown-divider"> <hr class="dropdown-divider">
......
.mat-form-field {
color: #7722ff !important; /* Changes the color of the label */
background-color: #012970;
}
.mat-input-element {
color: #26ff22; /* Changes the color of the input text */
}
.mat-hint {
color: #ff5722; /* Changes the color of the hint */
}
.mat-form-field-underline .mat-form-field-ripple {
background-color: #ff5722; /* Changes the color of the underline */
}
.mat-form-field.mat-focused .mat-form-field-label {
color: #ff5722; /* Changes the color of the label when focused */
}
.accordion-button::after {
flex-shrink: 0;
width: var(--bs-accordion-btn-icon-width);
height: var(--bs-accordion-btn-icon-width);
margin-right: auto;
content: "";
background-image: var(--bs-accordion-btn-icon);
background-repeat: no-repeat;
background-size: var(--bs-accordion-btn-icon-width);
transition: var(--bs-accordion-btn-icon-transition);
}
#toast-container { #toast-container {
width: 100%; width: 100%;
top: 30px; top: 30px;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment