@@ -13,18 +13,26 @@ import Paper from '@material-ui/core/Paper';
13
13
import styles from '../../../assets/jss/material-dashboard-react/views/dashboardStyle' ;
14
14
import { getPushes } from '../../../services/git-push' ;
15
15
import { KeyboardArrowRight } from '@material-ui/icons' ;
16
+ import Search from '../../../components/Search/Search' ; // Import the Search component
17
+ import Pagination from '../../../components/Pagination/Pagination' ; // Import Pagination component
16
18
17
19
export default function PushesTable ( props ) {
18
20
const useStyles = makeStyles ( styles ) ;
19
21
const classes = useStyles ( ) ;
20
22
const [ data , setData ] = useState ( [ ] ) ;
21
- const [ , setAuth ] = useState ( true ) ;
23
+ const [ filteredData , setFilteredData ] = useState ( [ ] ) ; // State for filtered data
22
24
const [ isLoading , setIsLoading ] = useState ( false ) ;
23
25
const [ isError , setIsError ] = useState ( false ) ;
24
26
const navigate = useNavigate ( ) ;
25
-
27
+ const [ , setAuth ] = useState ( true ) ;
28
+ const [ currentPage , setCurrentPage ] = useState ( 1 ) ; // State for current page
29
+ const itemsPerPage = 5 ;
30
+ const [ searchTerm , setSearchTerm ] = useState ( '' ) ; // Define searchTerm state
26
31
const openPush = ( push ) => navigate ( `/admin/push/${ push } ` , { replace : true } ) ;
27
32
33
+
34
+
35
+
28
36
useEffect ( ( ) => {
29
37
const query = { } ;
30
38
@@ -35,94 +43,161 @@ export default function PushesTable(props) {
35
43
getPushes ( setIsLoading , setData , setAuth , setIsError , query ) ;
36
44
} , [ props ] ) ;
37
45
46
+
47
+ // useEffect(() => {
48
+ // setFilteredData(data); // Initialize filtered data with full data on load
49
+ // }, [data]);
50
+
51
+ useEffect ( ( ) => {
52
+ // Initialize filtered data with full data on load
53
+ const filtered = filterByStatus ( data ) ;
54
+ setFilteredData ( filtered ) ;
55
+ } , [ props ] ) ;
56
+
57
+ const filterByStatus = ( data ) => {
58
+ if ( props . authorised ) {
59
+ return data . filter ( item => item . status === 'approved' ) ;
60
+ }
61
+ if ( props . rejected ) {
62
+ return data . filter ( item => item . status === 'rejected' ) ;
63
+ }
64
+ if ( props . canceled ) {
65
+ return data . filter ( item => item . status === 'canceled' ) ;
66
+ }
67
+ if ( props . blocked ) {
68
+ return data . filter ( item => item . status === 'pending' ) ;
69
+ }
70
+ return data ;
71
+ } ;
72
+
73
+
74
+ // Apply search to the filtered data
75
+ useEffect ( ( ) => {
76
+ const filtered = filterByStatus ( data ) ; // Apply status filter first
77
+ if ( searchTerm ) {
78
+ const lowerCaseTerm = searchTerm . toLowerCase ( ) ;
79
+ const searchFiltered = filtered . filter ( ( item ) =>
80
+ item . repo . toLowerCase ( ) . includes ( lowerCaseTerm ) ||
81
+ item . commitTo . toLowerCase ( ) . includes ( lowerCaseTerm ) ||
82
+
83
+ item . commitData [ 0 ] . message . toLowerCase ( ) . includes ( lowerCaseTerm )
84
+ ) ;
85
+ setFilteredData ( searchFiltered ) ;
86
+ } else {
87
+ setFilteredData ( filtered ) ; // Reset to filtered data after clearing search
88
+ }
89
+ setCurrentPage ( 1 ) ; // Reset pagination on search
90
+ } , [ searchTerm , props ] ) ; // Trigger on search or tab change
91
+
92
+ // Handler function for search input
93
+ const handleSearch = ( searchTerm ) => {
94
+ setSearchTerm ( searchTerm ) ; // Update search term state
95
+ } ;
96
+
97
+
98
+ const handlePageChange = ( page ) => {
99
+ setCurrentPage ( page ) ; // Update current page
100
+ } ;
101
+
102
+ // Logic for pagination (getting items for the current page)
103
+ const indexOfLastItem = currentPage * itemsPerPage ;
104
+ const indexOfFirstItem = indexOfLastItem - itemsPerPage ;
105
+ const currentItems = filteredData . slice ( indexOfFirstItem , indexOfLastItem ) ;
106
+
107
+ // Change page
108
+ const paginate = ( pageNumber ) => setCurrentPage ( pageNumber ) ;
109
+
38
110
if ( isLoading ) return < div > Loading...</ div > ;
39
111
if ( isError ) return < div > Something went wrong ...</ div > ;
40
112
41
113
return (
42
114
< div >
115
+ < Search onSearch = { handleSearch } /> { /* Use the Search component */ }
116
+
117
+
43
118
< TableContainer component = { Paper } >
44
- < Table className = { classes . table } aria-label = ' simple table' >
119
+ < Table className = { classes . table } aria-label = " simple table" >
45
120
< TableHead >
46
121
< TableRow >
47
- < TableCell align = ' left' > Timestamp</ TableCell >
48
- < TableCell align = ' left' > Repository</ TableCell >
49
- < TableCell align = ' left' > Branch</ TableCell >
50
- < TableCell align = ' left' > Commit SHA</ TableCell >
51
- < TableCell align = ' left' > Committer</ TableCell >
52
- < TableCell align = ' left' > Author</ TableCell >
53
- < TableCell align = ' left' > Author E-mail</ TableCell >
54
- < TableCell align = ' left' > Commit Message</ TableCell >
55
- < TableCell align = ' left' > No. of Commits</ TableCell >
56
- < TableCell align = ' right' > </ TableCell >
122
+ < TableCell align = " left" > Timestamp</ TableCell >
123
+ < TableCell align = " left" > Repository</ TableCell >
124
+ < TableCell align = " left" > Branch</ TableCell >
125
+ < TableCell align = " left" > Commit SHA</ TableCell >
126
+ < TableCell align = " left" > Committer</ TableCell >
127
+ < TableCell align = " left" > Author</ TableCell >
128
+ < TableCell align = " left" > Author E-mail</ TableCell >
129
+ < TableCell align = " left" > Commit Message</ TableCell >
130
+ < TableCell align = " left" > No. of Commits</ TableCell >
131
+ < TableCell align = " right" > </ TableCell >
57
132
</ TableRow >
58
133
</ TableHead >
59
134
< TableBody >
60
- { [ ... data ] . reverse ( ) . map ( ( row ) => {
135
+ { currentItems . reverse ( ) . map ( ( row ) => {
61
136
const repoFullName = row . repo . replace ( '.git' , '' ) ;
62
137
const repoBranch = row . branch . replace ( 'refs/heads/' , '' ) ;
63
138
64
139
return (
65
140
< TableRow key = { row . id } >
66
- < TableCell align = ' left' >
141
+ < TableCell align = " left" >
67
142
{ moment
68
143
. unix ( row . commitData [ 0 ] . commitTs || row . commitData [ 0 ] . commitTimestamp )
69
144
. toString ( ) }
70
145
</ TableCell >
71
- < TableCell align = ' left' >
72
- < a href = { `https://github.com/${ row . repo } ` } rel = ' noreferrer' target = ' _blank' >
146
+ < TableCell align = " left" >
147
+ < a href = { `https://github.com/${ row . repo } ` } rel = " noreferrer" target = " _blank" >
73
148
{ repoFullName }
74
149
</ a >
75
150
</ TableCell >
76
- < TableCell align = ' left' >
151
+ < TableCell align = " left" >
77
152
< a
78
153
href = { `https://github.com/${ repoFullName } /tree/${ repoBranch } ` }
79
- rel = ' noreferrer'
80
- target = ' _blank'
154
+ rel = " noreferrer"
155
+ target = " _blank"
81
156
>
82
157
{ repoBranch }
83
158
</ a >
84
159
</ TableCell >
85
- < TableCell align = ' left' >
160
+ < TableCell align = " left" >
86
161
< a
87
162
href = { `https://github.com/${ repoFullName } /commit/${ row . commitTo } ` }
88
- rel = ' noreferrer'
89
- target = ' _blank'
163
+ rel = " noreferrer"
164
+ target = " _blank"
90
165
>
91
166
{ row . commitTo . substring ( 0 , 8 ) }
92
167
</ a >
93
168
</ TableCell >
94
- < TableCell align = ' left' >
169
+ < TableCell align = " left" >
95
170
< a
96
171
href = { `https://github.com/${ row . commitData [ 0 ] . committer } ` }
97
- rel = ' noreferrer'
98
- target = ' _blank'
172
+ rel = " noreferrer"
173
+ target = " _blank"
99
174
>
100
175
{ row . commitData [ 0 ] . committer }
101
176
</ a >
102
177
</ TableCell >
103
- < TableCell align = ' left' >
178
+ < TableCell align = " left" >
104
179
< a
105
180
href = { `https://github.com/${ row . commitData [ 0 ] . author } ` }
106
- rel = ' noreferrer'
107
- target = ' _blank'
181
+ rel = " noreferrer"
182
+ target = " _blank"
108
183
>
109
184
{ row . commitData [ 0 ] . author }
110
185
</ a >
111
186
</ TableCell >
112
- < TableCell align = ' left' >
187
+ < TableCell align = " left" >
113
188
{ row . commitData [ 0 ] . authorEmail ? (
114
189
< a href = { `mailto:${ row . commitData [ 0 ] . authorEmail } ` } >
115
190
{ row . commitData [ 0 ] . authorEmail }
116
191
</ a >
117
192
) : (
118
193
'No data...'
119
- ) } { ' ' }
194
+ ) }
120
195
</ TableCell >
121
- < TableCell align = ' left' > { row . commitData [ 0 ] . message } </ TableCell >
122
- < TableCell align = ' left' > { row . commitData . length } </ TableCell >
123
- < TableCell component = 'th' scope = ' row' >
124
- < Button variant = ' contained' color = ' primary' onClick = { ( ) => openPush ( row . id ) } >
125
- < KeyboardArrowRight > </ KeyboardArrowRight >
196
+ < TableCell align = " left" > { row . commitData [ 0 ] . message } </ TableCell >
197
+ < TableCell align = " left" > { row . commitData . length } </ TableCell >
198
+ < TableCell component = "th" scope = " row" >
199
+ < Button variant = " contained" color = " primary" onClick = { ( ) => openPush ( row . id ) } >
200
+ < KeyboardArrowRight / >
126
201
</ Button >
127
202
</ TableCell >
128
203
</ TableRow >
@@ -131,6 +206,14 @@ export default function PushesTable(props) {
131
206
</ TableBody >
132
207
</ Table >
133
208
</ TableContainer >
209
+ { /* Pagination Component */ }
210
+ < Pagination
211
+ itemsPerPage = { itemsPerPage }
212
+ totalItems = { filteredData . length }
213
+ paginate = { paginate }
214
+ currentPage = { currentPage }
215
+ onPageChange = { handlePageChange }
216
+ />
134
217
</ div >
135
218
) ;
136
219
}
0 commit comments