@@ -2,6 +2,7 @@ import React, { useState, useEffect, useContext } from "react";
22import { useNavigate , useParams } from "react-router-dom" ;
33import axios from "axios" ;
44import {
5+ Autocomplete ,
56 Box ,
67 Button ,
78 Card ,
@@ -37,7 +38,13 @@ export default function Reports({ basePath = "/policy" }) {
3738 const [ totalPages , setTotalPages ] = useState ( 1 ) ;
3839 const [ statusFilter , setStatusFilter ] = useState ( "" ) ;
3940 const [ assigneeFilter , setAssigneeFilter ] = useState ( "" ) ;
41+ const [ assigneeQuery , setAssigneeQuery ] = useState ( "" ) ;
42+ const [ assigneeOptions , setAssigneeOptions ] = useState ( [ ] ) ;
43+ const [ assigneeIdMap , setAssigneeIdMap ] = useState ( { } ) ;
4044 const [ reportedUserFilter , setReportedUserFilter ] = useState ( "" ) ;
45+ const [ reportedUserQuery , setReportedUserQuery ] = useState ( "" ) ;
46+ const [ reportedUserOptions , setReportedUserOptions ] = useState ( [ ] ) ;
47+ const [ reportedUserIdMap , setReportedUserIdMap ] = useState ( { } ) ;
4148 const [ selectedReport , setSelectedReport ] = useState ( null ) ;
4249 const [ showDetail , setShowDetail ] = useState ( false ) ;
4350
@@ -56,6 +63,44 @@ export default function Reports({ basePath = "/policy" }) {
5663 }
5764 } , [ page , statusFilter , assigneeFilter , reportedUserFilter , reportId ] ) ;
5865
66+ useEffect ( ( ) => {
67+ if ( assigneeQuery . length === 0 ) {
68+ setAssigneeOptions ( [ ] ) ;
69+ return ;
70+ }
71+
72+ axios
73+ . get ( `/api/user/searchName?query=${ assigneeQuery } ` )
74+ . then ( ( res ) => {
75+ const newIdMap = { } ;
76+ for ( let userData of res . data ) {
77+ newIdMap [ userData . name ] = userData . id ;
78+ }
79+ setAssigneeIdMap ( newIdMap ) ;
80+ setAssigneeOptions ( res . data . map ( ( user ) => user . name ) ) ;
81+ } )
82+ . catch ( errorAlert ) ;
83+ } , [ assigneeQuery ] ) ;
84+
85+ useEffect ( ( ) => {
86+ if ( reportedUserQuery . length === 0 ) {
87+ setReportedUserOptions ( [ ] ) ;
88+ return ;
89+ }
90+
91+ axios
92+ . get ( `/api/user/searchName?query=${ reportedUserQuery } ` )
93+ . then ( ( res ) => {
94+ const newIdMap = { } ;
95+ for ( let userData of res . data ) {
96+ newIdMap [ userData . name ] = userData . id ;
97+ }
98+ setReportedUserIdMap ( newIdMap ) ;
99+ setReportedUserOptions ( res . data . map ( ( user ) => user . name ) ) ;
100+ } )
101+ . catch ( errorAlert ) ;
102+ } , [ reportedUserQuery ] ) ;
103+
59104 const loadReports = async ( ) => {
60105 try {
61106 setLoading ( true ) ;
@@ -160,25 +205,47 @@ export default function Reports({ basePath = "/policy" }) {
160205 </ FormControl >
161206 </ Grid >
162207 < Grid item xs = { 12 } sm = { 4 } >
163- < TextField
164- fullWidth
165- label = "Assignee User ID"
166- value = { assigneeFilter }
167- onChange = { ( e ) => {
168- setAssigneeFilter ( e . target . value ) ;
208+ < Autocomplete
209+ options = { assigneeOptions }
210+ inputValue = { assigneeQuery }
211+ onInputChange = { ( e , newValue ) => {
212+ setAssigneeQuery ( newValue ) ;
213+ } }
214+ onChange = { ( e , newValue ) => {
215+ setAssigneeFilter ( newValue ? assigneeIdMap [ newValue ] || "" : "" ) ;
169216 setPage ( 1 ) ;
170217 } }
218+ renderInput = { ( params ) => (
219+ < TextField
220+ { ...params }
221+ fullWidth
222+ label = "Assignee"
223+ />
224+ ) }
225+ freeSolo
226+ clearOnEscape
171227 />
172228 </ Grid >
173229 < Grid item xs = { 12 } sm = { 4 } >
174- < TextField
175- fullWidth
176- label = "Reported User ID"
177- value = { reportedUserFilter }
178- onChange = { ( e ) => {
179- setReportedUserFilter ( e . target . value ) ;
230+ < Autocomplete
231+ options = { reportedUserOptions }
232+ inputValue = { reportedUserQuery }
233+ onInputChange = { ( e , newValue ) => {
234+ setReportedUserQuery ( newValue ) ;
235+ } }
236+ onChange = { ( e , newValue ) => {
237+ setReportedUserFilter ( newValue ? reportedUserIdMap [ newValue ] || "" : "" ) ;
180238 setPage ( 1 ) ;
181239 } }
240+ renderInput = { ( params ) => (
241+ < TextField
242+ { ...params }
243+ fullWidth
244+ label = "Reported User"
245+ />
246+ ) }
247+ freeSolo
248+ clearOnEscape
182249 />
183250 </ Grid >
184251 </ Grid >
0 commit comments