import React, { cloneElement } from "react"; 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 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 UserIcon from "@mui/icons-material/Group"; import ViewListIcon from "@mui/icons-material/ViewList"; import { ArrayInput, ArrayField, Button, Datagrid, DateField, Create, Edit, List, Toolbar, SimpleForm, SimpleFormIterator, TabbedForm, FormTab, BooleanField, BooleanInput, PasswordInput, TextField, TextInput, ReferenceField, ReferenceManyField, SearchInput, SelectInput, BulkDeleteButton, DeleteButton, SaveButton, maxLength, regex, required, useRecordContext, useTranslate, Pagination, CreateButton, ExportButton, TopToolbar, sanitizeListRestProps, NumberField, } from "react-admin"; import { Link } from "react-router-dom"; import AvatarField from "./AvatarField"; import { ServerNoticeButton, ServerNoticeBulkButton } from "./ServerNotices"; import { DeviceRemoveButton } from "./devices"; import { ProtectMediaButton, QuarantineMediaButton } from "./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 date_format = { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit", }; const UserListActions = ({ sort, className, resource, filters, displayedFilters, exporter, // you can hide ExportButton if exporter = (null || false) filterValues, permanentFilter, hasCreate, // you can hide CreateButton if hasCreate = false selectedIds, onUnselectItems, showFilter, maxResults, total, ...rest }) => { return ( {filters && cloneElement(filters, { resource, showFilter, displayedFilters, filterValues, context: "button", })} {/* Add your custom actions */} ); }; UserListActions.defaultProps = { selectedIds: [], onUnselectItems: () => null, }; const UserPagination = props => ( ); const userFilters = [ , , , ]; const UserBulkActionButtons = () => ( <> ); export const UserList = props => ( } pagination={} > }> ); // https://matrix.org/docs/spec/appendices#user-identifiers // here only local part of user_id // maxLength = 255 - "@" - ":" - localStorage.getItem("home_server").length // localStorage.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)]; export function generateRandomUser() { const homeserver = localStorage.getItem("home_server"); const user_id = "@" + Array(8) .fill("0123456789abcdefghijklmnopqrstuvwxyz") .map( x => x[ Math.floor( (crypto.getRandomValues(new Uint32Array(1))[0] / (0xffffffff + 1)) * x.length ) ] ) .join("") + ":" + homeserver; const password = Array(20) .fill( "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$" ) .map( x => x[ Math.floor( (crypto.getRandomValues(new Uint32Array(1))[0] / (0xffffffff + 1)) * x.length ) ] ) .join(""); return { id: user_id, password: password, }; } const UserEditToolbar = props => ( ); const UserEditActions = ({ data }) => { const translate = useTranslate(); var userStatus = ""; if (data) { userStatus = data.deactivated; } return ( {!userStatus && } ); }; export const UserCreate = props => ( ); const UserTitle = () => { const record = useRecordContext(); const translate = useTranslate(); return ( {translate("resources.users.name", { smart_count: 1, })}{" "} {record ? `"${record.displayname}"` : ""} ); }; export const UserEdit = props => { const translate = useTranslate(); return ( } actions={}> }> } > } path="threepid" > } path="sso" > } path="devices" > } path="connections" > } path="media" > } perPage={50} sort={{ field: "created_ts", order: "DESC" }} > } path="rooms" > "/rooms/" + id + "/show"} > } path="pushers" > ); }; const resource = { name: "users", icon: UserIcon, list: UserList, edit: UserEdit, create: UserCreate, }; export default resource;