Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
PSManagementUI
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hasan.bahjat
PSManagementUI
Commits
c08bb819
Commit
c08bb819
authored
Aug 21, 2024
by
hasan khaddour
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add main domains services
parent
e65d8523
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
410 additions
and
125 deletions
+410
-125
jwt.interceptor.ts
src/app/core/interceptors/jwt.interceptor.ts
+1
-1
customer-create.component.ts
...tomers/pages/customer-create/customer-create.component.ts
+4
-8
customer-details.component.ts
...mers/pages/customer-details/customer-details.component.ts
+3
-9
customer-list.component.ts
.../customers/pages/customer-list/customer-list.component.ts
+3
-9
customer.service.ts
src/app/customers/services/customer.service.ts
+8
-8
employee.ts
src/app/employees/models/responses/employee.ts
+3
-2
employees.service.ts
src/app/employees/services/employees.service.ts
+20
-14
home.component.html
src/app/pages/home/home.component.html
+22
-13
login.component.html
src/app/pages/login/login.component.html
+2
-2
createProjectRequest.ts
src/app/projects/models/requests/createProjectRequest.ts
+32
-0
Department.ts
src/app/projects/models/responses/Department.ts
+5
-0
project.ts
src/app/projects/models/responses/project.ts
+5
-3
ProjectClassification.ts
...app/projects/models/valueObjects/ProjectClassification.ts
+5
-0
proposalInfo.ts
src/app/projects/models/valueObjects/proposalInfo.ts
+1
-0
project-create.component.css
...rojects/pages/project-create/project-create.component.css
+5
-0
project-create.component.html
...ojects/pages/project-create/project-create.component.html
+134
-11
project-create.component.ts
...projects/pages/project-create/project-create.component.ts
+97
-15
project-details.component.ts
...ojects/pages/project-details/project-details.component.ts
+3
-9
project-list.component.ts
...app/projects/pages/project-list/project-list.component.ts
+3
-4
project-routing.module.ts
src/app/projects/project-routing.module.ts
+2
-0
projects.module.ts
src/app/projects/projects.module.ts
+15
-11
project.service.ts
src/app/projects/services/project.service.ts
+4
-4
header.component.html
src/app/shared/sharedLayout/header/header.component.html
+2
-2
features-2.png
src/assets/images/home/features-2.png
+0
-0
greeting.webp
src/assets/images/home/greeting.webp
+0
-0
styles.css
src/styles.css
+31
-0
No files found.
src/app/core/interceptors/jwt.interceptor.ts
View file @
c08bb819
...
@@ -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
()
}
`
}
}
});
});
}
}
...
...
src/app/customers/pages/customer-create/customer-create.component.ts
View file @
c08bb819
...
@@ -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"
)
...
...
src/app/customers/pages/customer-details/customer-details.component.ts
View file @
c08bb819
...
@@ -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
)}
...
...
src/app/customers/pages/customer-list/customer-list.component.ts
View file @
c08bb819
...
@@ -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
();
}
}
...
...
src/app/customers/services/customer.service.ts
View file @
c08bb819
...
@@ -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
>
{
...
...
src/app/employees/models/responses/employee.ts
View file @
c08bb819
import
{
Availability
}
from
"../vakueObjects/
A
vailability"
import
{
Availability
}
from
"../vakueObjects/
a
vailability"
import
{
PersonalInfo
}
from
"../vakueObjects/personalInfo"
import
{
PersonalInfo
}
from
"../vakueObjects/personalInfo"
import
{
WorkInfo
}
from
"../vakueObjects/
W
orkInfo"
import
{
WorkInfo
}
from
"../vakueObjects/
w
orkInfo"
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
...
...
src/app/employees/services/employees.service.ts
View file @
c08bb819
...
@@ -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
);
);
...
...
src/app/pages/home/home.component.html
View file @
c08bb819
<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
src/app/pages/login/login.component.html
View file @
c08bb819
...
@@ -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>
...
...
src/app/projects/models/requests/createProjectRequest.ts
View file @
c08bb819
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
src/app/projects/models/responses/Department.ts
0 → 100644
View file @
c08bb819
export
class
Department
{
id
:
number
;
name
:
String
;
}
src/app/projects/models/responses/project.ts
View file @
c08bb819
...
@@ -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
}
}
src/app/projects/models/valueObjects/ProjectClassification.ts
0 → 100644
View file @
c08bb819
export
interface
ProjectClassification
{
projectStatus
:
string
;
projectType
:
string
;
projectNature
:
string
;
}
src/app/projects/models/valueObjects/proposalInfo.ts
View file @
c08bb819
...
@@ -2,3 +2,4 @@ export interface ProposalInfo{
...
@@ -2,3 +2,4 @@ export interface ProposalInfo{
proposingBookNumber
:
number
proposingBookNumber
:
number
proposingBookDate
:
Date
proposingBookDate
:
Date
}
}
src/app/projects/pages/project-create/project-create.component.css
View file @
c08bb819
:host
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
flex-start
;
}
\ No newline at end of file
src/app/projects/pages/project-create/project-create.component.html
View file @
c08bb819
<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>
src/app/projects/pages/project-create/project-create.component.ts
View file @
c08bb819
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
=
[];
}
}
}
}
src/app/projects/pages/project-details/project-details.component.ts
View file @
c08bb819
...
@@ -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
)}
...
...
src/app/projects/pages/project-list/project-list.component.ts
View file @
c08bb819
...
@@ -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
(
"لقد حدث خظاء ما"
);
...
...
src/app/projects/project-routing.module.ts
View file @
c08bb819
...
@@ -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
}
];
];
...
...
src/app/projects/projects.module.ts
View file @
c08bb819
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
,
Form
Group
,
FormsModule
,
ReactiveForm
sModule
}
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
{
}
src/app/projects/services/project.service.ts
View file @
c08bb819
...
@@ -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
);
}
}
}
}
src/app/shared/sharedLayout/header/header.component.html
View file @
c08bb819
...
@@ -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"
>
...
...
src/assets/images/home/features-2.png
0 → 100644
View file @
c08bb819
26.7 KB
src/assets/images/home/greeting.webp
0 → 100644
View file @
c08bb819
File added
src/styles.css
View file @
c08bb819
.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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment