import React, { cloneElement, Fragment } from "react"; import Avatar from "@material-ui/core/Avatar"; import PersonPinIcon from "@material-ui/icons/PersonPin"; import ContactMailIcon from "@material-ui/icons/ContactMail"; import DevicesIcon from "@material-ui/icons/Devices"; import GetAppIcon from "@material-ui/icons/GetApp"; import SettingsInputComponentIcon from "@material-ui/icons/SettingsInputComponent"; import { ArrayInput, ArrayField, Button, Datagrid, DateField, Create, Edit, List, Filter, Toolbar, SimpleForm, SimpleFormIterator, TabbedForm, FormTab, BooleanField, BooleanInput, PasswordInput, TextField, TextInput, ReferenceField, ReferenceManyField, SearchInput, SelectInput, BulkDeleteButton, DeleteButton, SaveButton, regex, useRedirect, useTranslate, Pagination, CreateButton, ExportButton, TopToolbar, sanitizeListRestProps, } from "react-admin"; import { ServerNoticeButton, ServerNoticeBulkButton } from "./ServerNotices"; import { DeviceRemoveButton } from "./devices"; import { makeStyles } from "@material-ui/core/styles"; const redirect = (basePath, id, data) => { return { pathname: "/importcsv", }; }; const useStyles = makeStyles({ small: { height: "40px", width: "40px", }, large: { height: "120px", width: "120px", float: "right", }, }); const UserListActions = ({ currentSort, className, resource, filters, displayedFilters, exporter, // you can hide ExportButton if exporter = (null || false) filterValues, permanentFilter, hasCreate, // you can hide CreateButton if hasCreate = false basePath, selectedIds, onUnselectItems, showFilter, maxResults, total, ...rest }) => { const redirectTo = useRedirect(); return ( {filters && cloneElement(filters, { resource, showFilter, displayedFilters, filterValues, context: "button", })} {/* Add your custom actions */} ); }; UserListActions.defaultProps = { selectedIds: [], onUnselectItems: () => null, }; const UserPagination = props => ( ); const UserFilter = props => ( ); const UserBulkActionButtons = props => { const translate = useTranslate(); return ( ); }; const AvatarField = ({ source, className, record = {} }) => ( ); export const UserList = props => { const classes = useStyles(); return ( } filterDefaultValues={{ guests: true, deactivated: false }} actions={} bulkActionButtons={} pagination={} > ); }; // https://matrix.org/docs/spec/appendices#user-identifiers const validateUser = regex( /^@[a-z0-9._=\-/]+:.*/, "synapseadmin.users.invalid_user_id" ); 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 translate = useTranslate(); return ( ); }; export const UserCreate = props => ( ); const UserTitle = ({ record }) => { const translate = useTranslate(); return ( {translate("resources.users.name", { smart_count: 1, })}{" "} {record ? `"${record.displayname}"` : ""} ); }; export const UserEdit = props => { const classes = useStyles(); const translate = useTranslate(); return ( }> }> } > } path="threepid" > } path="devices" > } path="connections" > ); };