Files
synapse-admin/src/components/rooms.js
T

107 lines
3.0 KiB
JavaScript
Raw Normal View History

2020-02-07 16:19:01 +01:00
import React from "react";
2020-04-16 23:31:41 +02:00
import {
BooleanInput,
Create,
Datagrid,
List,
Pagination,
SimpleForm,
TextField,
TextInput,
} from "react-admin";
2020-03-27 21:02:37 +01:00
const RoomPagination = props => (
<Pagination {...props} rowsPerPageOptions={[10, 25, 50, 100, 500, 1000]} />
);
2020-02-07 16:19:01 +01:00
export const RoomList = props => (
2020-03-27 21:02:37 +01:00
<List {...props} pagination={<RoomPagination />}>
2020-02-07 16:19:01 +01:00
<Datagrid>
<TextField source="room_id" />
<TextField source="name" />
<TextField source="canonical_alias" />
<TextField source="joined_members" />
</Datagrid>
</List>
);
2020-04-16 23:31:41 +02:00
function generateRoomRecord() {
return {
room_name: "",
public: true,
2020-04-17 00:09:56 +02:00
alias: "",
2020-04-16 23:31:41 +02:00
}
}
const validateDisplayName = fieldval => fieldval === undefined ? "synapseadmin.rooms.room_name_required" : fieldval.length === 0 ? "synapseadmin.rooms.room_name_required" : undefined;
2020-04-17 00:09:56 +02:00
function approximateAliasLength(alias, homeserver) {
/* TODO maybe handle punycode in homeserver URL */
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";
}
}
2020-04-16 23:31:41 +02:00
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;
2020-04-16 23:31:41 +02:00
2020-04-17 00:09:56 +02:00
const validateHasAliasIfPublic = formdata => {
let errors = {};
if (formdata.public) {
if (formdata.alias === undefined || formdata.alias.trim().length === 0) {
errors.alias = "synapseadmin.rooms.alias_required_if_public"
}
}
return errors;
}
2020-04-16 23:31:41 +02:00
export const RoomCreate = props => (
<Create record={generateRoomRecord()} {...props}>
2020-04-17 00:09:56 +02:00
<SimpleForm validate={validateHasAliasIfPublic}>
2020-04-16 23:31:41 +02:00
<TextInput source="room_name"
parse={removeLeadingWhitespace}
validate={validateDisplayName}/>
2020-04-17 00:09:56 +02:00
<TextInput source="alias"
parse={fv => replaceAllWhitespace(removeLeadingSigil(fv)) }
format={fv => fv === "" ? "" : "#" + fv}
2020-04-17 00:09:56 +02:00
validate={validateAlias}/>
2020-04-16 23:31:41 +02:00
<BooleanInput source="public"
label="synapseadmin.rooms.make_public"/>
</SimpleForm>
</Create>
);