Skip to content

Commit af9c6a1

Browse files
authored
fix: better styling for mod action search (#2586)
1 parent 6aca4be commit af9c6a1

File tree

2 files changed

+123
-23
lines changed

2 files changed

+123
-23
lines changed

react_main/src/pages/Policy/Moderation/ModActions.jsx

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ export function ModActions(props) {
1919
const [page, setPage] = useState(1);
2020
const [actions, setActions] = useState([]);
2121
const [staffNameFilter, setStaffNameFilter] = useState("");
22+
const [staffNameQuery, setStaffNameQuery] = useState("");
23+
const [staffNameOptions, setStaffNameOptions] = useState([]);
24+
const [staffIdMap, setStaffIdMap] = useState({});
2225
const [actionTypeFilter, setActionTypeFilter] = useState("");
2326

2427
const modCommands = useModCommands({}, () => {}, props.setResults);
@@ -30,6 +33,25 @@ export function ModActions(props) {
3033
loadActions(1);
3134
}, [staffNameFilter, actionTypeFilter]);
3235

36+
useEffect(() => {
37+
if (staffNameQuery.length === 0) {
38+
setStaffNameOptions([]);
39+
return;
40+
}
41+
42+
axios
43+
.get(`/api/user/searchName?query=${staffNameQuery}`)
44+
.then((res) => {
45+
const newIdMap = {};
46+
for (let userData of res.data) {
47+
newIdMap[userData.name] = userData.id;
48+
}
49+
setStaffIdMap(newIdMap);
50+
setStaffNameOptions(res.data.map((user) => user.name));
51+
})
52+
.catch(errorAlert);
53+
}, [staffNameQuery]);
54+
3355
function loadActions(_page) {
3456
const params = new URLSearchParams();
3557

@@ -161,20 +183,31 @@ export function ModActions(props) {
161183
<Typography variant="h3">Mod Actions</Typography>
162184
<Stack direction="column" spacing={2}>
163185
<Stack
164-
direction={{ xs: "column", sm: "row" }}
186+
direction="column"
165187
spacing={2}
166188
sx={{ mb: 1 }}
167189
>
168-
<TextField
169-
label="Search by Staff Name"
170-
variant="outlined"
171-
size="small"
172-
value={staffNameFilter}
173-
onChange={(e) => {
174-
setStaffNameFilter(e.target.value);
190+
<Autocomplete
191+
options={staffNameOptions}
192+
inputValue={staffNameQuery}
193+
onInputChange={(e, newValue) => {
194+
setStaffNameQuery(newValue);
195+
}}
196+
onChange={(e, newValue) => {
197+
setStaffNameFilter(newValue || "");
175198
setPage(1);
176199
}}
177-
sx={{ minWidth: 200 }}
200+
renderInput={(params) => (
201+
<TextField
202+
{...params}
203+
label="Staff Name"
204+
variant="outlined"
205+
size="small"
206+
/>
207+
)}
208+
sx={{ width: 290 }}
209+
freeSolo
210+
clearOnEscape
178211
/>
179212
<Autocomplete
180213
options={actionTypeOptions}
@@ -186,12 +219,12 @@ export function ModActions(props) {
186219
renderInput={(params) => (
187220
<TextField
188221
{...params}
189-
label="Filter by Action Type"
222+
label="Action Type"
190223
variant="outlined"
191224
size="small"
192225
/>
193226
)}
194-
sx={{ minWidth: 250 }}
227+
sx={{ width: 290 }}
195228
clearOnEscape
196229
/>
197230
</Stack>

react_main/src/pages/Policy/Reports.jsx

Lines changed: 79 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useContext } from "react";
22
import { useNavigate, useParams } from "react-router-dom";
33
import axios from "axios";
44
import {
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

Comments
 (0)