[#7] fixed attendee search in full display

This commit is contained in:
Camille Moussu
2025-08-28 16:27:08 +02:00
parent 1c6cdb382b
commit 282cbfc80e
4 changed files with 36 additions and 18 deletions
+20 -8
View File
@@ -9,6 +9,7 @@ import {
} from "@mui/material"; } from "@mui/material";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { searchUsers } from "../../features/User/userAPI"; import { searchUsers } from "../../features/User/userAPI";
import { userAttendee } from "../../features/User/userDataTypes";
interface User { interface User {
email: string; email: string;
@@ -17,9 +18,13 @@ interface User {
} }
export default function UserSearch({ export default function UserSearch({
attendees,
setAttendees, setAttendees,
disabled,
}: { }: {
attendees: userAttendee[];
setAttendees: Function; setAttendees: Function;
disabled?: boolean;
}) { }) {
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const [options, setOptions] = useState<User[]>([]); const [options, setOptions] = useState<User[]>([]);
@@ -40,6 +45,7 @@ export default function UserSearch({
<Autocomplete <Autocomplete
multiple multiple
options={options} options={options}
disabled={disabled}
loading={loading} loading={loading}
filterOptions={(x) => x} filterOptions={(x) => x}
fullWidth fullWidth
@@ -75,14 +81,20 @@ export default function UserSearch({
}} }}
/> />
)} )}
renderOption={(props, option) => ( renderOption={(props, option) => {
<ListItem {...props} key={option.email} disableGutters> if (attendees.find((a) => a.cal_address === option.email)) return;
<ListItemAvatar> return (
<Avatar src={option.avatarUrl} alt={option.displayName} /> <ListItem {...props} key={option.email} disableGutters>
</ListItemAvatar> <ListItemAvatar>
<ListItemText primary={option.displayName} secondary={option.email} /> <Avatar src={option.avatarUrl} alt={option.displayName} />
</ListItem> </ListItemAvatar>
)} <ListItemText
primary={option.displayName}
secondary={option.email}
/>
</ListItem>
);
}}
/> />
); );
} }
+9 -1
View File
@@ -360,7 +360,15 @@ export default function EventDisplayModal({
rows={2} rows={2}
/> />
<AttendeeSelector setAttendees={setAttendees} /> {isOwn && (
<AttendeeSelector
attendees={attendees}
setAttendees={(value: userAttendee[]) => {
const newAttendeeList = attendees.concat(value);
setAttendees(newAttendeeList);
}}
/>
)}
<TextField <TextField
fullWidth fullWidth
+1 -1
View File
@@ -275,7 +275,7 @@ function EventPopover({
size="small" size="small"
margin="dense" margin="dense"
/> />
<AttendeeSelector setAttendees={setAttendees} /> <AttendeeSelector attendees={attendees} setAttendees={setAttendees} />
{/* Extended options */} {/* Extended options */}
{showMore && ( {showMore && (
<> <>
+6 -8
View File
@@ -16,14 +16,12 @@ export async function searchUsers(query: string) {
}) })
.json(); .json();
return response return response.map((user) => ({
.filter((user) => user.objectType === "user") email: user.emailAddresses?.[0]?.value || "",
.map((user) => ({ displayName:
email: user.emailAddresses?.[0]?.value || "", user.names?.[0]?.displayName || user.emailAddresses?.[0]?.value,
displayName: avatarUrl: user.photos?.[0]?.url || "",
user.names?.[0]?.displayName || user.emailAddresses?.[0]?.value, }));
avatarUrl: user.photos?.[0]?.url || "",
}));
} }
export async function getUserDetails(id: string) { export async function getUserDetails(id: string) {