@@ -2,10 +2,11 @@ import React, { useState } from 'react';
2
2
import { FaAngleDown } from 'react-icons/fa6' ;
3
3
import TeamChart from '../Chart/TeamChart' ;
4
4
import ProgressBar from '../Chart/ProgressBar' ;
5
+ import UsersChart from '../Chart/usersChart' ;
5
6
6
7
interface TeamData {
7
8
ttlName ?: string ;
8
- team ?: string ;
9
+ teams ?: string ;
9
10
organization ?: string ;
10
11
program ?: string ;
11
12
phase ?: string ;
@@ -18,7 +19,8 @@ interface TeamData {
18
19
interface TeamDetailsModalProps {
19
20
isOpen : boolean ;
20
21
onClose : ( ) => void ;
21
- teamData : TeamData | null ;
22
+ selectedteam : TeamData | null ;
23
+ Teams ?: any ;
22
24
}
23
25
24
26
// Add this near the top of your TeamDetailsModal component
@@ -43,7 +45,8 @@ const loginStats = {
43
45
function TeamDetailsModal ( {
44
46
isOpen,
45
47
onClose,
46
- teamData,
48
+ selectedteam,
49
+ Teams,
47
50
} : TeamDetailsModalProps ) {
48
51
const [ activeTab , setActiveTab ] = useState < 'overview' | 'logins' > ( 'overview' ) ;
49
52
const [ timeframe , setTimeframe ] = useState < 'daily' | 'weekly' | 'monthly' > (
@@ -56,6 +59,75 @@ function TeamDetailsModal({
56
59
57
60
if ( ! isOpen ) return null ;
58
61
62
+ const CurrentTeam = Teams ?. filter (
63
+ ( items : any ) => items ?. name === selectedteam ?. teams ,
64
+ ) ;
65
+
66
+ const average =
67
+ ( parseInt ( CurrentTeam [ 0 ] ?. avgRatings ?. quality , 2 ) +
68
+ parseInt ( CurrentTeam [ 0 ] ?. avgRatings ?. quantity , 2 ) +
69
+ parseInt ( CurrentTeam [ 0 ] ?. avgRatings ?. professional_Skills , 2 ) ) /
70
+ 3 ;
71
+
72
+ const activeMembers = CurrentTeam [ 0 ] ?. members . filter (
73
+ ( item : any ) => item . status . status !== 'suspended' ,
74
+ ) ;
75
+ const droppedMembers = CurrentTeam [ 0 ] ?. members . filter (
76
+ ( item : any ) => item . status . status === 'suspended' ,
77
+ ) ;
78
+ function mapLoginsByDate ( team : any ) {
79
+ if ( ! team || ! Array . isArray ( team [ 0 ] . members ) ) {
80
+ throw new Error ( 'Invalid team object' ) ;
81
+ }
82
+ const loginCounts : any = { } ;
83
+ team [ 0 ] . members . forEach ( ( member : any ) => {
84
+ const activities = member . profile ?. activity ;
85
+
86
+ if ( Array . isArray ( activities ) ) {
87
+ activities . forEach ( ( activity ) => {
88
+ const rawDate = activity . date ;
89
+ const timestamp = parseInt ( rawDate , 10 ) ;
90
+ if ( ! Number . isNaN ( timestamp ) ) {
91
+ const loginDate = new Date ( timestamp ) . toISOString ( ) . split ( 'T' ) [ 0 ] ;
92
+ if ( ! loginCounts [ loginDate ] ) {
93
+ loginCounts [ loginDate ] = { success : 0 , failed : 0 } ;
94
+ }
95
+ if ( activity . failed === 1 ) {
96
+ loginCounts [ loginDate ] . failed += 1 ;
97
+ } else {
98
+ loginCounts [ loginDate ] . success += 1 ;
99
+ }
100
+ }
101
+ } ) ;
102
+ }
103
+ } ) ;
104
+ return loginCounts ;
105
+ }
106
+ const loginsbyDate = mapLoginsByDate ( CurrentTeam ) ;
107
+ const orgName = localStorage . getItem ( 'orgName' ) ;
108
+
109
+ function calculateLoginPercentages ( data : any ) {
110
+ let totalSuccess = 0 ;
111
+ let totalFailed = 0 ;
112
+
113
+ // Sum up all successes and failures
114
+ Object . values ( data ) . forEach ( ( { success, failed } : any ) => {
115
+ totalSuccess += success ;
116
+ totalFailed += failed ;
117
+ } ) ;
118
+
119
+ // Calculate percentages
120
+ const total = totalSuccess + totalFailed ;
121
+ const successPercentage = total > 0 ? ( totalSuccess / total ) * 100 : 0 ;
122
+ const failedPercentage = total > 0 ? ( totalFailed / total ) * 100 : 0 ;
123
+
124
+ return {
125
+ successPercentage : successPercentage . toFixed ( 2 ) ,
126
+ failedPercentage : failedPercentage . toFixed ( 2 ) ,
127
+ totalLogins : total ,
128
+ } ;
129
+ }
130
+
59
131
return (
60
132
< div className = "fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm" >
61
133
< div
@@ -101,15 +173,18 @@ function TeamDetailsModal({
101
173
< div >
102
174
< div className = "grid grid-cols-2 gap-4" >
103
175
{ [
104
- [ 'TTL Name' , teamData ?. ttlName || 'Sostene' ] ,
105
- [ 'Team Name' , teamData ?. team || 'Team Name' ] ,
176
+ [ 'TTL Name' , CurrentTeam [ 0 ] ?. ttl ?. profile ?. name || 'Sostene' ] ,
177
+ [ 'Team Name' , selectedteam ?. teams || 'Team Name' ] ,
178
+ [ 'Organization' , selectedteam ?. organization || orgName ] ,
179
+ [
180
+ 'Program' ,
181
+ CurrentTeam [ 0 ] ?. cohort ?. program ?. name || 'Program Name' ,
182
+ ] ,
106
183
[
107
- 'Organization ' ,
108
- teamData ?. organization || 'Organization Name ' ,
184
+ 'Phase ' ,
185
+ CurrentTeam [ 0 ] ?. cohort ?. phase ?. name || 'Current Phase ' ,
109
186
] ,
110
- [ 'Program' , teamData ?. program || 'Program Name' ] ,
111
- [ 'Phase' , teamData ?. phase || 'Current Phase' ] ,
112
- [ 'Cohort' , teamData ?. cohort || 'Current Cohort' ] ,
187
+ [ 'Cohort' , CurrentTeam [ 0 ] ?. cohort . name || 'Current Cohort' ] ,
113
188
] . map ( ( [ label , value ] , idx ) => (
114
189
// eslint-disable-next-line react/no-array-index-key
115
190
< div key = { idx } className = "space-y-2" >
@@ -132,15 +207,15 @@ function TeamDetailsModal({
132
207
Active Members
133
208
</ p >
134
209
< p className = "text-xl font-semibold text-green-600 dark:text-green-400" >
135
- { teamData ?. activeUsers || '0' }
210
+ { activeMembers ?. length || '0' }
136
211
</ p >
137
212
</ div >
138
213
< div className = "p-4 bg-red-50 dark:bg-red-900/20 rounded-lg" >
139
214
< p className = "text-sm text-gray-600 dark:text-gray-400" >
140
215
Dropped Members
141
216
</ p >
142
217
< p className = "text-xl font-semibold text-red-600 dark:text-red-400" >
143
- { teamData ?. droppedUsers || '0' }
218
+ { droppedMembers ?. length || '0' }
144
219
</ p >
145
220
</ div >
146
221
</ div >
@@ -162,13 +237,14 @@ function TeamDetailsModal({
162
237
{ showAttendanceSummary && (
163
238
< div className = "absolute z-10 bg-white dark:bg-gray-800 p-4 rounded-lg shadow-lg w-[200px] border border-gray-200 dark:border-gray-700" >
164
239
< p className = "text-gray-800 dark:text-gray-200" >
165
- Quality: 1.5
240
+ Quality: { CurrentTeam [ 0 ] ?. avgRatings ?. quality || 0 }
166
241
</ p >
167
242
< p className = "text-gray-800 dark:text-gray-200" >
168
- Quantity: 2.3
243
+ Quantity: { CurrentTeam [ 0 ] ?. avgRatings ?. quality || 0 }
169
244
</ p >
170
245
< p className = "text-gray-800 dark:text-gray-200" >
171
- Professionalism: 3.1
246
+ Professionalism:{ ' ' }
247
+ { CurrentTeam [ 0 ] ?. avgRatings ?. professional_Skills || 0 }
172
248
</ p >
173
249
</ div >
174
250
) }
@@ -180,7 +256,7 @@ function TeamDetailsModal({
180
256
</ label >
181
257
< div className = "p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg" >
182
258
< p className = "text-lg font-semibold text-blue-600 dark:text-blue-400" >
183
- { teamData ?. rating || '4.5 ' } / 5.0
259
+ { average || '0 ' } / 5.0
184
260
</ p >
185
261
</ div >
186
262
</ div >
@@ -231,20 +307,30 @@ function TeamDetailsModal({
231
307
Logins Attempt Status
232
308
</ h3 >
233
309
< ProgressBar
234
- passedPercentage = { loginStats [ timeframe ] . passed }
235
- failedPercentage = { loginStats [ timeframe ] . failed }
310
+ passedPercentage = { parseInt (
311
+ calculateLoginPercentages ( loginsbyDate ) . successPercentage ,
312
+ 10 ,
313
+ ) }
314
+ failedPercentage = { parseInt (
315
+ calculateLoginPercentages ( loginsbyDate ) . failedPercentage ,
316
+ 10 ,
317
+ ) }
236
318
/>
237
319
</ div >
238
320
< p className = "mt-4 ml-[12%]" >
239
321
Total Logins:{ ' ' }
240
322
< span className = "font-bold text-primary" >
241
323
{ ' ' }
242
- { loginStats [ timeframe ] . total }
324
+ { calculateLoginPercentages ( loginsbyDate ) . totalLogins }
243
325
</ span >
244
326
</ p >
245
327
</ div >
246
328
247
- < TeamChart timeframe = { timeframe } />
329
+ < TeamChart
330
+ timeframe = { timeframe }
331
+ CurrentTeam = { CurrentTeam }
332
+ loginsbyDate = { loginsbyDate }
333
+ />
248
334
</ div >
249
335
) }
250
336
</ div >
0 commit comments