import AssignmentIndIcon from "@mui/icons-material/AssignmentInd"; import ContactMailIcon from "@mui/icons-material/ContactMail"; import DevicesIcon from "@mui/icons-material/Devices"; import GetAppIcon from "@mui/icons-material/GetApp"; import UserIcon from "@mui/icons-material/Group"; import NotificationsIcon from "@mui/icons-material/Notifications"; import PermMediaIcon from "@mui/icons-material/PermMedia"; import PersonPinIcon from "@mui/icons-material/PersonPin"; import SettingsInputComponentIcon from "@mui/icons-material/SettingsInputComponent"; import ViewListIcon from "@mui/icons-material/ViewList"; import { useEffect, useState } from "react"; import { Alert, ownerDocument } from "@mui/material"; import { ArrayInput, ArrayField, Button, Datagrid, DateField, Create, CreateProps, Edit, EditProps, List, ListProps, SimpleForm, SimpleFormIterator, TabbedForm, FormTab, BooleanField, BooleanInput, PasswordInput, TextField, TextInput, ReferenceField, ReferenceManyField, ResourceProps, SearchInput, SelectInput, BulkDeleteButton, DeleteButton, maxLength, regex, required, useRecordContext, useTranslate, Pagination, SaveButton, CreateButton, ExportButton, TopToolbar, Toolbar, NumberField, useListContext, useNotify, ToolbarClasses, Identifier, RaRecord, ImageInput, ImageField, } from "react-admin"; import { Link } from "react-router-dom"; import AvatarField from "../components/AvatarField"; import { isASManaged } from "../components/mxid"; import { ServerNoticeButton, ServerNoticeBulkButton } from "../components/ServerNotices"; import { DATE_FORMAT } from "../components/date"; import { DeviceRemoveButton } from "../components/devices"; import { MediaIDField, ProtectMediaButton, QuarantineMediaButton } from "../components/media"; const choices_medium = [ { id: "email", name: "resources.users.email" }, { id: "msisdn", name: "resources.users.msisdn" }, ]; const choices_type = [ { id: "bot", name: "bot" }, { id: "support", name: "support" }, ]; const UserListActions = () => { const { isLoading, total } = useListContext(); return ( ); }; UserListActions.defaultProps = { selectedIds: [], onUnselectItems: () => null, }; const UserPagination = () => ; const userFilters = [ , , , , ]; const UserPreventSelfDelete: React.FC<{ children: React.ReactNode; ownUserIsSelected: boolean; asManagedUserIsSelected: boolean }> = props => { const ownUserIsSelected = props.ownUserIsSelected; const asManagedUserIsSelected = props.asManagedUserIsSelected; const notify = useNotify(); const translate = useTranslate(); const handleDeleteClick = (ev: React.MouseEvent) => { if (ownUserIsSelected) { notify({translate("resources.users.helper.erase_admin_error")}); ev.stopPropagation(); } else if (asManagedUserIsSelected) { notify({translate("resources.users.helper.erase_managed_user_error")}); ev.stopPropagation(); } }; return
{props.children}
; }; const UserBulkActionButtons = () => { const record = useListContext(); const [ownUserIsSelected, setOwnUserIsSelected] = useState(false); const [asManagedUserIsSelected, setAsManagedUserIsSelected] = useState(false); const selectedIds = record.selectedIds; const ownUserId = localStorage.getItem("user_id"); const notify = useNotify(); const translate = useTranslate(); useEffect(() => { setOwnUserIsSelected(selectedIds.includes(ownUserId)); setAsManagedUserIsSelected(selectedIds.some(id => isASManaged(id))); }, [selectedIds]); return ( <> ); }; const usersRowClick = (id: Identifier, resource: string, record: RaRecord): string => { return `/users/${id}`; }; export const UserList = (props: ListProps) => ( } pagination={} > }> ); // https://matrix.org/docs/spec/appendices#user-identifiers // here only local part of user_id // maxLength = 255 - "@" - ":" - storage.getItem("home_server").length // storage.getItem("home_server").length is not valid here const validateUser = [required(), maxLength(253), regex(/^[a-z0-9._=\-/]+$/, "synapseadmin.users.invalid_user_id")]; const validateAddress = [required(), maxLength(255)]; const UserEditActions = () => { const record = useRecordContext(); const translate = useTranslate(); const ownUserId = localStorage.getItem("user_id"); let ownUserIsSelected = false; let asManagedUserIsSelected = false; if (record && record.id) { ownUserIsSelected = record.id === ownUserId; asManagedUserIsSelected = isASManaged(record.id); } return ( {!record?.deactivated && } ); }; export const UserCreate = (props: CreateProps) => ( { return `users/${id}`; }} > ); const UserTitle = () => { const record = useRecordContext(); const translate = useTranslate(); let username = record ? (record.displayname ? `"${record.displayname}"` : `"${record.name}"`) : "" if (isASManaged(record?.id)) { username += " 🤖"; } return ( {translate("resources.users.name", { smart_count: 1, })}{" "} {username} ); }; const UserEditToolbar = () => { const record = useRecordContext(); const ownUserId = localStorage.getItem("user_id"); let ownUserIsSelected = false; let asManagedUserIsSelected = false; if (record && record.id) { ownUserIsSelected = record.id === ownUserId; asManagedUserIsSelected = isASManaged(record.id); } return ( <>
); }; const UserBooleanInput = props => { const record = useRecordContext(); const ownUserId = localStorage.getItem("user_id"); let ownUserIsSelected = false; let asManagedUserIsSelected = false; if (record) { ownUserIsSelected = record.id === ownUserId; asManagedUserIsSelected = isASManaged(record.id); } return ( ); }; const UserPasswordInput = props => { const record = useRecordContext(); let asManagedUserIsSelected = false; if (record) { asManagedUserIsSelected = isASManaged(record.id); } return ( ); }; export const UserEdit = (props: EditProps) => { const translate = useTranslate(); return ( } actions={} mutationMode="pessimistic"> }> }> } path="threepid"> } path="sso"> } path="devices"> } path="connections"> } path="media" > } perPage={50} sort={{ field: "created_ts", order: "DESC" }} > } path="rooms"> "/rooms/" + id + "/show"} bulkActionButtons={false}> } path="pushers" > ); }; const resource: ResourceProps = { name: "users", icon: UserIcon, list: UserList, edit: UserEdit, create: UserCreate, }; export default resource;