import React from "react"; import { connect } from "react-redux"; import { AutocompleteArrayInput, BooleanInput, BooleanField, Create, Datagrid, Filter, FormTab, List, Pagination, ReferenceArrayInput, ReferenceField, ReferenceManyField, SelectField, Show, Tab, TabbedForm, TabbedShowLayout, TextField, TextInput, useTranslate, } from "react-admin"; import get from "lodash/get"; import { Tooltip, Typography, Chip } from "@material-ui/core"; import HttpsIcon from "@material-ui/icons/Https"; import NoEncryptionIcon from "@material-ui/icons/NoEncryption"; import PageviewIcon from "@material-ui/icons/Pageview"; import UserIcon from "@material-ui/icons/Group"; import ViewListIcon from "@material-ui/icons/ViewList"; import VisibilityIcon from "@material-ui/icons/Visibility"; const RoomPagination = props => ( ); const EncryptionField = ({ source, record = {}, emptyText }) => { const translate = useTranslate(); const value = get(record, source); let ariaLabel = value === false ? "ra.boolean.false" : "ra.boolean.true"; if (value === false || value === true) { return ( {value === true ? ( ) : ( )} ); } return ( {emptyText} ); }; const validateDisplayName = fieldval => fieldval === undefined ? "synapseadmin.rooms.room_name_required" : fieldval.length === 0 ? "synapseadmin.rooms.room_name_required" : undefined; function approximateAliasLength(alias, homeserver) { /* TODO maybe handle punycode in homeserver name */ var te; // Support for TextEncoder is quite widespread, but the polyfill is // pretty large; We will only underestimate the size with the regular // length attribute of String, so we never prevent the user from using // an alias that is short enough for the server, but too long for our // heuristic. try { te = new TextEncoder(); } catch (err) { if (err instanceof ReferenceError) { te = undefined; } } const aliasLength = te === undefined ? alias.length : te.encode(alias).length; return "#".length + aliasLength + ":".length + homeserver.length; } const validateAlias = fieldval => { if (fieldval === undefined) { return undefined; } const homeserver = localStorage.getItem("home_server"); if (approximateAliasLength(fieldval, homeserver) > 255) { return "synapseadmin.rooms.alias_too_long"; } }; const removeLeadingWhitespace = fieldVal => fieldVal === undefined ? undefined : fieldVal.trimStart(); const replaceAllWhitespace = fieldVal => fieldVal === undefined ? undefined : fieldVal.replace(/\s/, "_"); const removeLeadingSigil = fieldVal => fieldVal === undefined ? undefined : fieldVal.startsWith("#") ? fieldVal.substr(1) : fieldVal; const validateHasAliasIfPublic = formdata => { let errors = {}; if (formdata.public) { if ( formdata.canonical_alias === undefined || formdata.canonical_alias.trim().length === 0 ) { errors.canonical_alias = "synapseadmin.rooms.alias_required_if_public"; } } return errors; }; export const RoomCreate = props => ( }> replaceAllWhitespace(removeLeadingSigil(fv))} validate={validateAlias} placeholder="#" /> } > ({ user_id: searchText })} > ); const RoomTitle = ({ record }) => { const translate = useTranslate(); return ( {translate("resources.rooms.name", 1)} {record ? `"${record.name}"` : ""} ); }; export const RoomShow = props => { const translate = useTranslate(); return ( }> }> } path="detail" > }> "/users/" + id} > } path="permission" > ); }; const RoomFilter = ({ ...props }) => { const translate = useTranslate(); return ( ); }; const FilterableRoomList = ({ ...props }) => { const filter = props.roomFilters; const localMembersFilter = filter && filter.joined_local_members ? true : false; const stateEventsFilter = filter && filter.state_events ? true : false; const versionFilter = filter && filter.version ? true : false; const federateableFilter = filter && filter.federatable ? true : false; return ( } sort={{ field: "name", order: "ASC" }} filters={} > } /> {localMembersFilter && } {stateEventsFilter && } {versionFilter && } {federateableFilter && } ); }; function mapStateToProps(state) { return { roomFilters: state.admin.resources.rooms.list.params.displayedFilters, }; } export const RoomList = connect(mapStateToProps)(FilterableRoomList);