Offer room creation form

A choice of public or private is offered, which maps to matrix'
visibility parameter. A name can also be provided.

Change-Id: I34d99acbc4624a9ed54ca6f6609573d5fc1049da
This commit is contained in:
Timo Paulssen 2020-04-16 23:31:41 +02:00
parent e9c3901b68
commit ca15435625
5 changed files with 92 additions and 3 deletions

View File

@ -4,7 +4,7 @@ import polyglotI18nProvider from "ra-i18n-polyglot";
import authProvider from "./synapse/authProvider"; import authProvider from "./synapse/authProvider";
import dataProvider from "./synapse/dataProvider"; import dataProvider from "./synapse/dataProvider";
import { UserList, UserCreate, UserEdit } from "./components/users"; import { UserList, UserCreate, UserEdit } from "./components/users";
import { RoomList } from "./components/rooms"; import { RoomList, RoomCreate } from "./components/rooms";
import LoginPage from "./components/LoginPage"; import LoginPage from "./components/LoginPage";
import UserIcon from "@material-ui/icons/Group"; import UserIcon from "@material-ui/icons/Group";
import { ViewListIcon as RoomIcon } from "@material-ui/icons/ViewList"; import { ViewListIcon as RoomIcon } from "@material-ui/icons/ViewList";
@ -40,7 +40,11 @@ const App = () => (
edit={UserEdit} edit={UserEdit}
icon={UserIcon} icon={UserIcon}
/> />
<Resource name="rooms" list={RoomList} icon={RoomIcon} /> <Resource
name="rooms"
list={RoomList}
create={RoomCreate}
icon={RoomIcon} />
<Resource name="connections" /> <Resource name="connections" />
</Admin> </Admin>
); );

View File

@ -1,5 +1,14 @@
import React from "react"; import React from "react";
import { Datagrid, List, TextField, Pagination } from "react-admin"; import {
BooleanInput,
Create,
Datagrid,
List,
Pagination,
SimpleForm,
TextField,
TextInput,
} from "react-admin";
const RoomPagination = props => ( const RoomPagination = props => (
<Pagination {...props} rowsPerPageOptions={[10, 25, 50, 100, 500, 1000]} /> <Pagination {...props} rowsPerPageOptions={[10, 25, 50, 100, 500, 1000]} />
@ -15,3 +24,27 @@ export const RoomList = props => (
</Datagrid> </Datagrid>
</List> </List>
); );
function generateRoomRecord() {
return {
room_name: "",
public: true,
}
}
const validateDisplayName = fieldval => fieldval === undefined ? "synapseadmin.rooms.room_name_required" : fieldval.length === 0 ? "synapseadmin.rooms.room_name_required" : undefined;
const removeLeadingWhitespace = fieldVal => fieldVal === undefined ? undefined : fieldVal.trimStart();
export const RoomCreate = props => (
<Create record={generateRoomRecord()} {...props}>
<SimpleForm>
<TextInput source="room_name"
label="synapseadmin.rooms.room_name"
parse={removeLeadingWhitespace}
validate={validateDisplayName}/>
<BooleanInput source="public"
label="synapseadmin.rooms.make_public"/>
</SimpleForm>
</Create>
);

View File

@ -16,6 +16,12 @@ export default {
invalid_user_id: invalid_user_id:
"Muss eine vollständige Matrix Benutzer-ID sein, z.B. @benutzer_id:homeserver", "Muss eine vollständige Matrix Benutzer-ID sein, z.B. @benutzer_id:homeserver",
}, },
rooms: {
room_name: "Raumname",
make_public: "Öffentlicher Raum",
room_name_required:
"Muss angegeben werden",
}
}, },
resources: { resources: {
users: { users: {

View File

@ -16,6 +16,12 @@ export default {
invalid_user_id: invalid_user_id:
"Must be a fully qualified Matrix user-id, e.g. @user_id:homeserver", "Must be a fully qualified Matrix user-id, e.g. @user_id:homeserver",
}, },
rooms: {
room_name: "Room Name",
make_public: "Make room public",
room_name_required:
"Must be provided",
}
}, },
resources: { resources: {
users: { users: {

View File

@ -67,6 +67,36 @@ function filterNullValues(key, value) {
return value; return value;
} }
const roomCreationMap = {
path: "/_matrix/client/r0/createRoom",
map: r => ({
room_id: r.room_id
})
};
const roomCreationProvider = {
create: (resource, params) => {
const homeserver = localStorage.getItem("home_server");
const homeserver_url = "https://" + homeserver + roomCreationMap.path;
const newParams = { ...params.data,
public: undefined,
room_name: undefined,
name: params.data.room_name,
visibility: params.data.public ? "public" : "private",
}
return jsonClient(homeserver_url, {
method: "POST",
body: JSON.stringify(newParams, filterNullValues),
}).then(({ json }) => ({
data: roomCreationMap.map(json),
}));
}
};
const dataProvider = { const dataProvider = {
getList: (resource, params) => { getList: (resource, params) => {
console.log("getList " + resource); console.log("getList " + resource);
@ -211,6 +241,16 @@ const dataProvider = {
const res = resourceMap[resource]; const res = resourceMap[resource];
const homeserver_url = homeserver + res.path; const homeserver_url = homeserver + res.path;
/* Special handling for rooms, as creating a room
is a POST request rather than put, and goes through
the client-server API rather than the admin API. */
if (resource === "rooms") {
console.log("want to create a room!");
console.log(params);
return roomCreationProvider.create(resource, params);
}
return jsonClient(`${homeserver_url}/${params.data.id}`, { return jsonClient(`${homeserver_url}/${params.data.id}`, {
method: "PUT", method: "PUT",
body: JSON.stringify(params.data, filterNullValues), body: JSON.stringify(params.data, filterNullValues),