Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nisum-scorecard
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
Venkaiah Naidu Singamchetty
nisum-scorecard
Commits
476909ea
Commit
476909ea
authored
Mar 18, 2024
by
Venkaiah Naidu Singamchetty
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'apiserver' into 'master'
pagination added See merge request
!48
parents
dc7f4018
4df1b3a3
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
244 additions
and
138 deletions
+244
-138
Pagenation.jsx
src/components/Pagenation/Pagenation.jsx
+25
-0
accordionTable.jsx
src/components/accordion/accordionTable.jsx
+2
-2
index.jsx
src/components/accordion/index.jsx
+1
-1
DateRangePicker.jsx
src/components/dateRangePicker/DateRangePicker.jsx
+2
-2
index.jsx
src/components/leftSidebar/index.jsx
+34
-29
index.jsx
src/components/modal/index.jsx
+14
-14
modalButton.jsx
src/components/modal/modalButton.jsx
+1
-1
index.jsx
src/components/table/index.jsx
+1
-1
index.css
src/index.css
+7
-2
index.jsx
src/pages/dashboard/index.jsx
+74
-24
index.jsx
src/pages/layout/index.jsx
+1
-1
index.jsx
src/pages/reports/index.jsx
+80
-61
reporteesSlice.js
src/redux/reducers/reporteesSlice.js
+2
-0
No files found.
src/components/Pagenation/Pagenation.jsx
0 → 100644
View file @
476909ea
import
React
from
'react'
;
const
PaginationComponent
=
({
currentPage
,
totalPages
,
onPageChange
})
=>
{
const
pageNumbers
=
[];
for
(
let
i
=
1
;
i
<=
totalPages
;
i
++
)
{
pageNumbers
.
push
(
i
);
}
return
(
<
nav
className=
"flex justify-center "
>
<
ul
className=
"pagination flex"
>
{
pageNumbers
.
map
(
number
=>
(
<
li
key=
{
number
}
className=
{
`page-item ${number === currentPage ? 'active' : ''}`
}
>
<
button
onClick=
{
()
=>
onPageChange
(
number
)
}
className=
" w-[22px] font-bold h-[22px] "
>
{
number
}
</
button
>
</
li
>
))
}
</
ul
>
</
nav
>
);
};
export
default
PaginationComponent
;
src/components/accordion/accordionTable.jsx
View file @
476909ea
...
...
@@ -26,9 +26,9 @@ function AccordionTable({ headers, data }) {
<
td
className=
{
`border-2 p-2 border-[#B7B7B7] bg-${
header.id === "aName" ? "[#D9D9D9]" : "white"
}`
}
}`
}
>
{
header
?.
id
===
'recorded_date'
?
<
span
>
{
getDate
(
item
[
header
?.
id
])
}
</
span
>
:
<
span
>
{
item
[
header
?.
id
]
}
</
span
>
}
{
header
?.
id
===
'recorded_date'
?
<
span
>
{
getDate
(
item
[
header
?.
id
])
}
</
span
>
:
<
span
className=
"truncate overflow-hidden whitespace-nowrap overflow-ellipsis"
>
{
item
[
header
?.
id
]
}
</
span
>
}
</
td
>
))
}
</
tr
>
...
...
src/components/accordion/index.jsx
View file @
476909ea
...
...
@@ -42,7 +42,7 @@ function Accordion({ title, data ,handleAddActivity,open,handleAccordian}) {
const
headers
=
[
{
title
:
"Activity Name"
,
id
:
"aName"
,
width
:
"30%"
},
{
title
:
"Date"
,
id
:
"recorded_date"
,
width
:
"20%"
,
render
:
(
value
)
=>
moment
(
value
).
format
(
'DD-MM-YYYY'
)
},
{
title
:
"Score"
,
id
:
"score"
,
width
:
"10%"
,
render
:
(
value
)
=>
<
div
className=
"w-[35px] bg-blue-
200 rounded-m
d text-center p-[4px]"
>
{
value
}
</
div
>
},
{
title
:
"Score"
,
id
:
"score"
,
width
:
"10%"
,
render
:
(
value
)
=>
<
div
className=
"w-[35px] bg-blue-
400 rounded-full text-white font-bol
d text-center p-[4px]"
>
{
value
}
</
div
>
},
{
title
:
"Comments"
,
id
:
"comments"
,
width
:
"40%"
},
];
...
...
src/components/dateRangePicker/DateRangePicker.jsx
View file @
476909ea
...
...
@@ -24,9 +24,9 @@ const DateRangePicker = ({getReports}) => {
return
(
<
div
>
<
label
htmlFor=
"start"
className=
"font-bold ps-2"
>
From:
</
label
>
<
input
type=
"date"
id=
"start"
name=
"start"
placeholder=
"MM-DD-YYYY"
className=
"rounded-md font-semibold ms-1 ps-2 text-[#555]"
onChange=
{
(
e
)
=>
handleStartChange
(
e
.
target
.
value
)
}
/>
<
input
type=
"date"
id=
"start"
name=
"start"
placeholder=
"MM-DD-YYYY"
className=
"rounded-md font-semibold
text-sm
ms-1 ps-2 text-[#555]"
onChange=
{
(
e
)
=>
handleStartChange
(
e
.
target
.
value
)
}
/>
<
label
htmlFor=
"end"
className=
"font-bold ps-2"
>
To:
</
label
>
<
input
type=
"date"
id=
"end"
name=
"end"
placeholder=
"MM-DD-YYYY"
className=
"rounded-md font-semibold ms-1 ps-2 text-[#555]"
onChange=
{
(
e
)
=>
handleEndChange
(
e
.
target
.
value
)
}
/>
<
input
type=
"date"
id=
"end"
name=
"end"
placeholder=
"MM-DD-YYYY"
className=
"rounded-md font-semibold
text-sm
ms-1 ps-2 text-[#555]"
onChange=
{
(
e
)
=>
handleEndChange
(
e
.
target
.
value
)
}
/>
</
div
>
)
...
...
src/components/leftSidebar/index.jsx
View file @
476909ea
import
React
,
{
useEffect
,
useState
}
from
"react"
;
import
React
,
{
useEffect
,
useState
}
from
"react"
;
import
{
Link
}
from
"react-router-dom"
;
import
{
useSelector
}
from
"react-redux"
;
import
{
useParams
}
from
"react-router-dom"
;
import
Loading
from
"../loading Component/Loading"
;
function
LeftSidebar
()
{
const
{
reportees
,
loading
}
=
useSelector
((
state
)
=>
state
.
reportees
);
const
{
id
}
=
useParams
()
const
{
reportees
,
loading
}
=
useSelector
((
state
)
=>
state
.
reportees
);
const
{
id
}
=
useParams
()
return
(
<
div
className=
"mt-2 w-[30
%] flex flex-col px-[5px]"
>
<
p
className=
"text-xl text-blue-400 font-semibold pl-4 mt-3"
>
My Reportees
</
p
>
{
(
loading
)?
<
Loading
/>
:
<
div
className=
" w-[33
%] flex flex-col px-[5px]"
>
<
p
className=
"text-xl text-blue-400 font-semibold pl-4 mt-3"
>
My Reportees
</
p
>
{
(
loading
)
?
<
Loading
/>
:
<
div
className=
"p-2 bg-[#E9EDEE] mt-4 max-h-[80vh] overflow-auto"
>
{
reportees
?.
map
(({
empName
,
score
,
empId
})
=>
(
<
Link
to=
{
`/viewreportee/${empId}`
}
className=
{
`flex items-center bg-${
Number(id) === empId ? "blue-200" : "white"
} p-2 justify-between mb-1 w-full`
}
key=
{
empId
}
>
<
img
src=
"/man.png"
width=
"18px"
height=
"18px"
/>
<
p
className=
"w-[80%] text-left"
>
{
empName
}
</
p
>
<
p
className=
"w-[10%] bg-blue-200 rounded-sm text-center"
>
{
score
}
</
p
>
</
Link
>
))
}
</
div
>
}
</
div
>
{
reportees
?.
map
(({
empName
,
score
,
empId
})
=>
(
<
Link
to=
{
`/viewreportee/${empId}`
}
className=
{
`flex items-center bg-${Number(id) === empId ? "blue-200" : "white"
} p-2 justify-between mb-1 w-full`
}
key=
{
empId
}
>
<
img
src=
"/man.png"
width=
"18px"
height=
"18px"
/>
<
p
className=
"w-[80%] text-left"
>
{
empName
}
</
p
>
<
p
className=
{
`w-[30px] h-[30px] rounded-full flex items-center text-white justify-center
${score === 0 ? 'bg-red-500 ' : ''}
${score >= 1 && score < 2 ? 'bg-red-500' : ''}
${score >= 2 && score < 3 ? 'bg-yellow-500' : ''}
${score >= 3 && score < 4 ? 'bg-green-500 ' : ''}
${score >= 4 && score < 5 ? 'bg-green-600 ' : ''}
${score >= 5 ? 'bg-green-600 ' : ''}`
}
>
{
score
}
</
p
>
</
Link
>
))
}
</
div
>
}
</
div
>
);
}
...
...
src/components/modal/index.jsx
View file @
476909ea
...
...
@@ -66,30 +66,30 @@ export default function MyModal({ visible, onClose ,type,handleAddActivity}) {
return
(
<
div
className=
"absolute w-full h-full inset-0 bg-black bg-opacity-25 backdrop-blur-sm flex items-center justify-center"
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
>
<
div
className=
"bg-white rounded lg:w-4/12 sm:w-100"
>
<
div
className=
" text-white py-3 pl-2 bg-blue-500 "
>
{
activityType
}
Activity
</
div
>
<
div
className=
"bg-white rounded
-md
lg:w-4/12 sm:w-100"
>
<
div
className=
" text-white py-3 pl-2 bg-blue-500
rounded-md
"
>
{
activityType
}
Activity
</
div
>
<
div
>
<
div
>
<
form
className=
" p-2 max-w-sm mx-auto"
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
>
<
form
className=
" p-2 max-w-sm mx-auto
text-[12px]
"
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
>
<
div
className=
"flex items-center my-5"
>
<
label
htmlFor=
"countries"
>
S
elect Activity
:
</
label
>
<
label
htmlFor=
"countries"
>
S
ELECT ACTIVITY
:
</
label
>
<
select
className=
"bg-gray-50 ml-2 w-7/12 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
onChange=
{
(
e
)
=>
handleActivityName
(
e
)
}
>
<
option
id=
""
value=
""
className=
"text-[16px]"
>
Select
</
option
>
<
option
id=
""
value=
""
>
Select
</
option
>
{
activitiesList
&&
activitiesList
.
map
((
activity
)
=>
<
option
className=
"
text-[16px]
w-7/12"
key=
{
activity
.
aId
}
id=
{
activity
.
aId
}
value=
{
activity
.
aName
}
>
{
activity
.
aName
}
</
option
>)
activitiesList
&&
activitiesList
.
map
((
activity
)
=>
<
option
className=
" w-7/12"
key=
{
activity
.
aId
}
id=
{
activity
.
aId
}
value=
{
activity
.
aName
}
>
{
activity
.
aName
}
</
option
>)
}
</
select
>
</
div
>
<
div
className=
"flex items-center mb-4 "
>
<
label
htmlFor=
"appreciate"
className=
"
text-sm font-medium text-gray-900 dark:text-gray-300"
>
Appreciation
:
</
label
>
<
label
htmlFor=
"appreciate"
className=
"
font-medium dark:text-gray-300"
>
APPRECIATION
:
</
label
>
<
input
id=
"appreciate"
type=
"radio"
value=
"appreciate"
name=
"performance"
className=
"w-4 h-4 m-3 text-blue-600 bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600"
onChange=
{
()
=>
handlePerformance
(
1
)
}
/>
<
label
htmlFor=
"depreciate"
className=
"ms-2
text-sm font-medium text-gray-900 dark:text-gray-300"
>
Depreciation
:
</
label
>
<
label
htmlFor=
"depreciate"
className=
"ms-2
font-medium dark:text-gray-300"
>
DEPRECIATION
:
</
label
>
<
input
id=
"depreciate"
type=
"radio"
value=
"depreciate"
name=
"performance"
className=
"w-4 h-4 m-3 text-blue-600 bg-gray-100 border-gray-300 dark:bg-gray-700 dark:border-gray-600"
onChange=
{
()
=>
handlePerformance
(
-
1
)
}
/>
</
div
>
<
div
className=
"flex "
>
<
span
>
S
core
</
span
>
<
select
className=
"border w-1/5"
onChange=
{
(
e
)
=>
handleScoreChange
(
e
.
target
.
value
)
}
>
<
span
>
S
CORE:
</
span
>
<
select
className=
"border w-1/5
ms-1
"
onChange=
{
(
e
)
=>
handleScoreChange
(
e
.
target
.
value
)
}
>
<
option
value=
{
0
}
>
Select
</
option
>
<
option
value=
{
1
}
>
1
</
option
>
<
option
value=
{
2
}
>
2
</
option
>
...
...
@@ -100,8 +100,8 @@ export default function MyModal({ visible, onClose ,type,handleAddActivity}) {
</
div
>
<
div
className=
"flex items-center my-5"
>
<
label
htmlFor=
"comments"
className=
"block w-3/12 mb-20 text-s
m font-medium text-gray-900 dark:text-white"
>
Comments
:
</
label
>
<
textarea
id=
"comments"
rows=
"4"
className=
"block ml-2 p-2.5 w-9/12 text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
placeholder=
"activity comments
"
onChange=
{
(
e
)
=>
handleComments
(
e
)
}
<
label
htmlFor=
"comments"
className=
"block w-3/12 mb-20 text-s
tart font-medium dark:text-white"
>
COMMENTS
:
</
label
>
<
textarea
id=
"comments"
style=
{
{
resize
:
"none"
}
}
rows=
"4"
className=
"block ml-2 p-2.5 w-9/12 bg-gray-50 rounded-lg border border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
placeholder=
"Activity comments (optional)
"
onChange=
{
(
e
)
=>
handleComments
(
e
)
}
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
onKeyDown=
{
(
e
)
=>
{
// Prevent propagation of space key press
...
...
@@ -119,9 +119,9 @@ export default function MyModal({ visible, onClose ,type,handleAddActivity}) {
}
}
></
textarea
>
</
div
>
<
div
className=
"flex items-center justify-end mb-3"
>
<
button
onClick=
{
onClose
}
className=
"px-3 py-2
bg-gray-700 text-white rounded
"
>
Cancel
</
button
>
<
button
onClick=
{
onClose
}
className=
"px-3 py-2
rounded-md bg-gray-700 text-white
"
>
Cancel
</
button
>
{
enableSubmit
?<
button
type=
"button"
className=
"px-3 py-2 ml-5 bg-
green-700 text-white rounde
d"
onClick=
{
handleSubmit
}
>
Submit
</
button
>:
enableSubmit
?<
button
type=
"button"
className=
"px-3 py-2 ml-5 bg-
blue-500 text-white rounded-m
d"
onClick=
{
handleSubmit
}
>
Submit
</
button
>:
<
button
type=
"button"
className=
"px-3 py-2 ml-5 bg-gray-400 text-white rounded"
disabled=
{
!
enableSubmit
}
title=
"Please fill all fileds to submit"
>
Submit
</
button
>
}
...
...
src/components/modal/modalButton.jsx
View file @
476909ea
...
...
@@ -10,7 +10,7 @@ export default function ModalButton({type,handleAddActivity}) {
<
button
onClick=
{
()
=>
setShowMyModal
(
true
)
}
className=
"bg-blue-400 text-white px-2 py-1 rounded hover:scale-95 transition text-sm"
>
Add
Activity
Add
Score
</
button
>
<
MyModal
onClose=
{
handleOnClose
}
visible=
{
showMyModal
}
handleAddActivity=
{
handleAddActivity
}
type=
{
type
}
/>
</
div
>
...
...
src/components/table/index.jsx
View file @
476909ea
...
...
@@ -5,7 +5,7 @@ function Table({headers, data,loading, maxHeight}) {
if
(
loading
)
return
<
Loading
/>
if
(
data
?.
length
)
return
(
<
div
className=
{
` overflow-
x-
auto sm:rounded-lg p-4 max-h-[${maxHeight}vh] bg-gray-100`
}
>
<
div
className=
{
` overflow-auto sm:rounded-lg p-4 max-h-[${maxHeight}vh] bg-gray-100`
}
>
<
table
className=
"w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400 bg-transparent justify-center border-separate border-spacing-y-2"
>
<
thead
className=
"text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-white"
>
<
tr
className=
"mb-2"
>
...
...
src/index.css
View file @
476909ea
@tailwind
base
;
@tailwind
components
;
@tailwind
utilities
;
body
{
margin
:
0
;
font-family
:
-apple-system
,
BlinkMacSystemFont
,
'Segoe UI'
,
'Roboto'
,
'Oxygen'
,
...
...
@@ -17,4 +17,9 @@ code {
}
/* .listData:nth-child(4) {
padding-left: 35px;
} */
\ No newline at end of file
} */
.active
{
background
:
rgb
(
96
165
250
);
color
:
white
;
border-radius
:
50%
}
src/pages/dashboard/index.jsx
View file @
476909ea
import
React
,
{
useEffect
,
useState
}
from
"react"
;
import
{
Link
,
useNavigate
}
from
"react-router-dom"
;
import
{
Link
,
useNavigate
}
from
"react-router-dom"
;
import
{
useDispatch
,
useSelector
}
from
"react-redux"
;
import
{
fetchReportees
}
from
"../../redux/reducers/reporteesSlice"
;
import
Table
from
'../../components/table'
;
import
PaginationComponent
from
"../../components/Pagenation/Pagenation"
;
function
Dashboard
()
{
const
dispatch
=
useDispatch
();
const
navigate
=
useNavigate
();
const
{
reportees
,
loading
}
=
useSelector
((
state
)
=>
state
.
reportees
);
const
navigate
=
useNavigate
();
const
{
reportees
,
loading
,
totalCount
}
=
useSelector
((
state
)
=>
state
.
reportees
);
const
userDetails
=
useSelector
((
state
)
=>
state
.
userDetails
);
const
[
reporteIds
,
setReporteIds
]
=
useState
([]);
const
[
reporteIds
,
setReporteIds
]
=
useState
([]);
const
[
currPage
,
setCurrPage
]
=
useState
(
1
)
const
[
pagesCount
,
setPagesCount
]
=
useState
(
1
)
// userDetails.user.reportees || [];
const
handlePageChange
=
(
currPage
)
=>
{
let
data
=
{
reportees
:
userDetails
.
user
.
reportees
,
page
:
currPage
,
perPage
:
10
}
setCurrPage
(
currPage
)
dispatch
(
fetchReportees
(
data
))
}
// useEffect(() => {
// let data={
// reportees:reportees,
// ["page"]:page,
// }
// dispatch(fetchReportees(data))
// } ,[page]);
useEffect
(()
=>
{
setPagesCount
(
Math
.
ceil
((
totalCount
)
/
(
10
)))
},
[
totalCount
])
useEffect
(()
=>
{
if
(
reporteIds
.
length
>
0
)
{
const
data
=
{
reportees
:
userDetails
.
user
.
reportees
,
sort
:
{
type
:
"empId"
,
order
:
1
},
page
:
1
,
perPage
:
10
,
//
sort: { type: "empId", order: 1 },
page
:
currPage
,
perPage
:
10
};
dispatch
(
fetchReportees
(
data
));
}
},
[
reporteIds
]);
useEffect
(()
=>
{
if
(
userDetails
.
user
)
{
if
(
userDetails
.
user
)
{
setReporteIds
(
userDetails
.
user
.
reportees
)
navigate
(
"/dashboard"
)
}
else
{
navigate
(
"/dashboard"
)
}
else
{
navigate
(
"/"
)
}
},
[
userDetails
]);
const
headers
=
[
{
title
:
"Employee Name"
,
id
:
"empName"
,
render
:
(
value
)
=>
<
span
className=
"flex items-center"
><
img
className=
"pr-2"
src=
"/man.png"
width=
"30px"
height=
"30px"
/>
{
value
}
</
span
>
title
:
"Employee Name"
,
id
:
"empName"
,
render
:
(
value
)
=>
<
span
className=
"flex items-center"
><
img
className=
"pr-2"
src=
"/man.png"
width=
"30px"
height=
"30px"
/>
{
value
}
</
span
>
},
{
title
:
"Emp.Id"
,
title
:
"Emp.Id"
,
id
:
"empId"
},
{
title
:
"Designation"
,
title
:
"Designation"
,
id
:
'designation'
},
{
title
:
"score"
,
id
:
"score"
,
render
:
(
value
)
=>
<
div
className=
"bg-blue-200 rounded-md text-center p-[4px]"
>
{
value
}
</
div
>
title
:
"score"
,
id
:
"score"
,
render
:
(
value
)
=>
<
span
className=
{
`w-[30px] h-[30px] rounded-full flex items-center text-white justify-center
${value === 0 ? 'bg-red-500 ' : ''}
${value >= 1 && value < 2 ? 'bg-red-500' : ''}
${value >= 2 && value < 3 ? 'bg-yellow-500' : ''}
${value >= 3 && value < 4 ? 'bg-green-400 ' : ''}
${value >= 4 && value < 5 ? 'bg-green-600 ' : ''}
${value >= 5 ? 'bg-green-600 ' : ''}
`
}
>
{
value
}
</
span
>
},
{
title
:
"Email"
,
title
:
"Email"
,
id
:
'empEmail'
},
{
title
:
"Action"
,
id
:
"empId"
,
title
:
"Action"
,
id
:
"empId"
,
render
:
(
value
)
=>
<
Link
to=
{
`/viewreportee/${value}`
}
><
button
className=
"bg-blue-400 text-white rounded-md px-3 py-1"
>
View
</
button
></
Link
>
},
]
return
(
<
div
className=
"max-h-[87vh] "
>
<
Table
headers=
{
headers
}
data=
{
reportees
}
loading=
{
loading
}
maxHeight=
{
88
}
/>
</
div
>
<
div
className=
""
>
<
div
className=
"mb-2"
>
<
Table
headers=
{
headers
}
data=
{
reportees
}
loading=
{
loading
}
maxHeight=
{
88
}
/>
<
div
className=
""
>
{
reportees
&&
(
<
div
className=
"flex justify-end mt-2"
>
{
/* <div className="text-blue-500">Total Results: {pagesCount}</div> */
}
{
pagesCount
>
1
&&
(
<
PaginationComponent
currentPage=
{
currPage
}
totalPages=
{
pagesCount
}
onPageChange=
{
handlePageChange
}
/>
)
}
</
div
>
)
}
</
div
>
</
div
>
</
div
>
)
}
...
...
src/pages/layout/index.jsx
View file @
476909ea
...
...
@@ -6,7 +6,7 @@ import LeftSidebar from '../../components/leftSidebar';
function
Layout
({
children
})
{
const
url
=
window
.
location
.
href
;
return
(
<
div
>
<
div
className=
'max-h-[84vh]'
>
<
Header
/>
<
div
className=
"flex"
>
<
Sidebar
/>
...
...
src/pages/reports/index.jsx
View file @
476909ea
import
React
,
{
useState
,
useEffect
,
useMemo
}
from
"react"
;
import
{
useSelector
,
useDispatch
}
from
"react-redux"
;
import
{
useParams
,
useNavigate
}
from
"react-router"
;
import
{
useParams
,
useNavigate
}
from
"react-router"
;
import
{
base_url
}
from
"../../utils/constants"
;
import
axios
from
'axios'
;
import
{
fetchReports
}
from
"../../redux/reducers/reportSlice"
;
...
...
@@ -10,14 +10,14 @@ import DateRangePicker from "../../components/dateRangePicker/DateRangePicker";
function
Reports
()
{
const
dispatch
=
useDispatch
();
const
navigate
=
useNavigate
();
const
navigate
=
useNavigate
();
const
{
id
}
=
useParams
();
const
empId
=
Number
(
id
)
const
reportees
=
useSelector
((
state
)
=>
state
.
reportees
.
reportees
);
const
user
=
useSelector
((
state
)
=>
state
.
userDetails
.
user
)
const
user
=
useSelector
((
state
)
=>
state
.
userDetails
.
user
)
const
[
empDetails
,
setEmpDetails
]
=
useState
(
null
);
const
{
reports
,
loading
,
error
}
=
useSelector
((
state
)
=>
state
.
reports
);
const
[
open
,
setOpen
]
=
useState
({
"accordianOne"
:
false
,
"accordianTwo"
:
false
});
const
{
reports
,
loading
,
error
}
=
useSelector
((
state
)
=>
state
.
reports
);
const
[
open
,
setOpen
]
=
useState
({
"accordianOne"
:
false
,
"accordianTwo"
:
false
});
...
...
@@ -33,7 +33,7 @@ function Reports() {
const
filtered
=
Object
.
groupBy
(
reports
,
({
type
})
=>
type
);
return
filtered
;
}
},
[
reports
,
id
]);
},
[
reports
,
id
]);
const
handleAccordian
=
(
value
)
=>
{
switch
(
value
)
{
...
...
@@ -52,8 +52,8 @@ function Reports() {
const
data
=
{
"empId"
:
empId
,
"fromDate"
:
startDate
,
"toDate"
:
endDate
}
dispatch
(
fetchReports
(
data
))
}
const
fetchLatestReporteesData
=
()
=>
{
if
(
user
)
{
const
fetchLatestReporteesData
=
()
=>
{
if
(
user
)
{
const
data
=
{
reportees
:
user
.
reportees
,
sort
:
{
type
:
"empId"
,
order
:
1
},
...
...
@@ -62,10 +62,10 @@ function Reports() {
};
dispatch
(
fetchReportees
(
data
));
}
}
const
handleAddActivity
=
async
(
activityData
)
=>
{
}
const
handleAddActivity
=
async
(
activityData
)
=>
{
if
(
id
)
{
let
newData
=
{
"empId"
:
empId
,
...
...
@@ -74,8 +74,8 @@ function Reports() {
await
axios
.
post
(
`
${
base_url
}
/createActivity`
,
newData
)
.
then
(
async
(
result
)
=>
{
fetchLatestReporteesData
()
getReports
()
getReports
()
})
}
else
{
alert
(
"Please login"
)
...
...
@@ -83,7 +83,7 @@ function Reports() {
}
useEffect
(()
=>
{
if
(
id
!==
undefined
||
null
&&
reportees
.
length
>
0
)
{
if
(
id
!==
undefined
||
null
&&
reportees
.
length
>
0
)
{
const
emp
=
reportees
?.
filter
((
item
)
=>
item
.
empId
===
Number
(
id
));
setEmpDetails
(
emp
[
0
]);
const
data
=
{
...
...
@@ -96,64 +96,83 @@ function Reports() {
return
(()
=>
{
setEmpDetails
(
null
)
})
},
[
id
,
reportees
]);
},
[
id
,
reportees
]);
useEffect
(()
=>
{
if
(
user
)
{
navigate
(
`/viewreportee/
${
id
}
`
)
}
else
{
if
(
user
)
{
navigate
(
`/viewreportee/
${
id
}
`
)
}
else
{
navigate
(
"/"
)
}
},
[
id
]);
if
(
empDetails
&&
reportees
.
length
)
return
(
<
div
className=
"p-4"
>
<
div
className=
"bg-white p-3
"
>
<
div
className=
"flex
"
>
{
/* <img src="/generic-male-avatar-rectangular.jpg" width="100px" height="100px" /> */
}
<
div
className=
"w-1/2
"
>
<
p
>
<
span
className=
"font-medium"
>
Employee Name :
</
span
>
{
empDetails
?.
empName
}
</
p
>
<
p
>
<
span
className=
"font-medium"
>
Designation :
</
span
>
{
empDetails
?.
designation
}
</
p
>
<
p
>
if
(
empDetails
&&
reportees
.
length
)
return
(
<
div
className=
"p-4"
>
<
div
className=
"bg-white p-3 rounded-md
"
>
<
div
className=
"flex justify-between
"
>
{
/* <img src="/generic-male-avatar-rectangular.jpg" width="100px" height="100px" /> */
}
<
div
className=
"my-1
"
>
<
p
>
<
span
className=
"font-medium"
>
Employee Name :
</
span
>
{
empDetails
?.
empName
}
</
p
>
<
p
>
<
span
className=
"font-medium"
>
Designation :
</
span
>
{
empDetails
?.
designation
}
</
p
>
{
/*
<p>
<span className="font-medium">Email Id: </span> {empDetails?.empEmail}
</
p
>
</
div
>
<
div
className=
"w-1/2"
>
<
p
>
<
span
className=
"font-medium"
>
Employee Id:
</
span
>
{
empDetails
?.
empId
}
</
p
>
<
p
>
<
span
className=
"font-medium"
>
Average Score :
</
span
>
{
empDetails
?.
score
}
</
p
>
<
p
>
</p> */
}
</
div
>
<
div
className=
"my-1"
>
<
p
>
<
span
className=
"font-medium"
>
Email :
</
span
>
{
empDetails
?.
empEmail
}
</
p
>
<
p
>
<
span
className=
"font-medium"
>
Employee Id:
</
span
>
{
empDetails
?.
empId
}
</
p
>
{
/* <p>
<span className="font-medium">Total Score : </span> {empDetails?.score}
</p> */
}
{
/* <p>
<span className="font-medium">Allocated To : </span> {empDetails?.project}
</
p
>
</p> */
}
</
div
>
<
div
className=
"flex flex-col justify-center items-center"
>
<
div
className=
{
`w-[40px] h-[40px] rounded-full flex items-center text-white justify-center
${empDetails?.score === 0 ? 'bg-red-500 ' : ''}
${empDetails?.score >= 1 && empDetails?.score < 2 ? 'bg-red-500' : ''}
${empDetails?.score >= 2 && empDetails?.score < 3 ? 'bg-yellow-500' : ''}
${empDetails?.score >= 3 && empDetails?.score < 4 ? 'bg-green-500 ' : ''}
${empDetails?.score >= 4 && empDetails?.score < 5 ? 'bg-green-600 ' : ''}
${empDetails?.score >= 5 ? 'bg-green-600 ' : ''}
`
}
>
<
span
className=
"text-lg font-bold"
>
{
empDetails
?.
score
}
</
span
>
</
div
>
<
div
className=
""
>
<
span
className=
"text-blue-400 font-semibold"
>
Total Score
</
span
>
</
div
>
</
div
>
</
div
>
</
div
>
<
div
className=
"max-h-[70vh] overflow-auto"
>
<
div
className=
"container mx-auto mt-4 flex justify-end pe-4"
>
<
DateRangePicker
getReports=
{
getReports
}
/>
</
div
>
<
div
className=
"max-h-[50vh] overflow-auto"
>
<
Accordion
title=
"Default"
open=
{
open
.
accordianOne
}
handleAccordian=
{
handleAccordian
}
data=
{
activities
?.
default
}
handleAddActivity=
{
handleAddActivity
}
/>
</
div
>
<
div
className=
"max-h-[50vh] overflow-auto"
>
<
Accordion
title=
"Initiative"
open=
{
open
.
accordianTwo
}
handleAccordian=
{
handleAccordian
}
data=
{
activities
?.
initiative
}
handleAddActivity=
{
handleAddActivity
}
/>
</
div
>
</
div
>
</
div
>
);
else
return
<
div
className=
"w-full h-full"
>
<
p
className=
"text-center align-middle pt-14 pb-14 text-blue-500 font-bold"
>
Employee Details Not Found
</
p
>
</
div
>
<
div
className=
"max-h-[70vh] overflow-auto"
>
<
div
className=
"container mx-auto mt-4 flex justify-end pe-4"
>
<
DateRangePicker
getReports=
{
getReports
}
/>
</
div
>
<
div
className=
"max-h-[50vh] overflow-auto"
>
<
Accordion
title=
"Default"
open=
{
open
.
accordianOne
}
handleAccordian=
{
handleAccordian
}
data=
{
activities
?.
default
}
handleAddActivity=
{
handleAddActivity
}
/>
</
div
>
<
div
className=
"max-h-[50vh] overflow-auto"
>
<
Accordion
title=
"Initiative"
open=
{
open
.
accordianTwo
}
handleAccordian=
{
handleAccordian
}
data=
{
activities
?.
initiative
}
handleAddActivity=
{
handleAddActivity
}
/>
</
div
>
</
div
>
</
div
>
);
else
return
<
div
className=
"w-full h-full"
>
<
p
className=
"text-center align-middle pt-14 pb-14 text-blue-500 font-bold"
>
Employee Details Not Found
</
p
>
</
div
>
}
...
...
src/redux/reducers/reporteesSlice.js
View file @
476909ea
...
...
@@ -4,6 +4,7 @@ import axios from "axios";
const
initialState
=
{
reportees
:
[],
totalCount
:
0
,
loading
:
false
,
error
:
null
,
};
...
...
@@ -29,6 +30,7 @@ const reporteesSlice = createSlice({
builder
.
addCase
(
fetchReportees
.
fulfilled
,
(
state
,
action
)
=>
{
state
.
loading
=
false
;
state
.
reportees
=
action
.
payload
.
data
;
state
.
totalCount
=
action
.
payload
.
totalCount
.
count
;
state
.
error
=
""
;
});
builder
.
addCase
(
fetchReportees
.
rejected
,
(
state
,
action
)
=>
{
...
...
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