diff --git a/README.md b/README.md
index a2e0190..722d54b 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
This project is built using [react-admin](https://marmelab.com/react-admin/).
-It needs at least Synapse v1.18.0 for all functions to work as expected!
+It needs at least Synapse v1.23.0 for all functions to work as expected!
You get your server version with the request `/_synapse/admin/v1/server_version`.
See also [Synapse version API](https://github.com/matrix-org/synapse/blob/develop/docs/admin_api/version_api.rst).
diff --git a/src/App.js b/src/App.js
index 6ad0b22..5b784c4 100644
--- a/src/App.js
+++ b/src/App.js
@@ -5,9 +5,11 @@ import authProvider from "./synapse/authProvider";
import dataProvider from "./synapse/dataProvider";
import { UserList, UserCreate, UserEdit } from "./components/users";
import { RoomList, RoomShow } from "./components/rooms";
+import { ReportList, ReportShow } from "./components/EventReports";
import LoginPage from "./components/LoginPage";
import UserIcon from "@material-ui/icons/Group";
-import { ViewListIcon as RoomIcon } from "@material-ui/icons/ViewList";
+import RoomIcon from "@material-ui/icons/ViewList";
+import ReportIcon from "@material-ui/icons/Warning";
import { ImportFeature } from "./components/ImportFeature";
import { Route } from "react-router-dom";
import germanMessages from "./i18n/de";
@@ -41,6 +43,12 @@ const App = () => (
icon={UserIcon}
/>
+
diff --git a/src/components/EventReports.js b/src/components/EventReports.js
new file mode 100644
index 0000000..c73647f
--- /dev/null
+++ b/src/components/EventReports.js
@@ -0,0 +1,135 @@
+import React from "react";
+import {
+ Datagrid,
+ DateField,
+ List,
+ NumberField,
+ Pagination,
+ ReferenceField,
+ Show,
+ Tab,
+ TabbedShowLayout,
+ TextField,
+ useTranslate,
+} from "react-admin";
+import PageviewIcon from "@material-ui/icons/Pageview";
+import ViewListIcon from "@material-ui/icons/ViewList";
+
+const ReportPagination = props => (
+
+);
+
+export const ReportShow = props => {
+ const translate = useTranslate();
+ return (
+
+
+ }
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ path="detail"
+ >
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export const ReportList = ({ ...props }) => {
+ return (
+
}
+ sort={{ field: "received_ts", order: "DESC" }}
+ bulkActionButtons={false}
+ >
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/i18n/de.js b/src/i18n/de.js
index d0d47fa..1b60545 100644
--- a/src/i18n/de.js
+++ b/src/i18n/de.js
@@ -29,6 +29,7 @@ export default {
"Sind Sie sicher dass Sie den Raum löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden. Alle Nachrichten und Medien, die der Raum beinhaltet werden vom Server gelöscht!",
},
},
+ reports: { tabs: { basic: "Allgemein", detail: "Details" } },
},
import_users: {
error: {
@@ -173,6 +174,30 @@ export default {
unencrypted: "Nicht verschlüsselt",
},
},
+ reports: {
+ name: "Ereignisbericht |||| Ereignisberichte",
+ fields: {
+ id: "ID",
+ received_ts: "Meldezeit",
+ user_id: "Meldender",
+ name: "Raumname",
+ score: "Wert",
+ reason: "Grund",
+ event_id: "Event-ID",
+ event_json: {
+ origin: "Ursprungsserver",
+ origin_server_ts: "Sendezeit",
+ type: "Eventtyp",
+ content: {
+ msgtype: "Inhaltstyp",
+ body: "Nachrichteninhalt",
+ format: "Nachrichtenformat",
+ formatted_body: "Formatierter Nachrichteninhalt",
+ algorithm: "Verschlüsselungsalgorithmus",
+ },
+ },
+ },
+ },
connections: {
name: "Verbindungen",
fields: {
diff --git a/src/i18n/en.js b/src/i18n/en.js
index 43788ed..76b33aa 100644
--- a/src/i18n/en.js
+++ b/src/i18n/en.js
@@ -27,6 +27,7 @@ export default {
"Are you sure you want to delete the room? This cannot be undone. All messages and shared media in the room will be deleted from the server!",
},
},
+ reports: { tabs: { basic: "Basic", detail: "Details" } },
},
import_users: {
error: {
@@ -170,6 +171,30 @@ export default {
unencrypted: "Unencrypted",
},
},
+ reports: {
+ name: "Reported event |||| Reported events",
+ fields: {
+ id: "ID",
+ received_ts: "report time",
+ user_id: "announcer",
+ name: "name of the room",
+ score: "score",
+ reason: "reason",
+ event_id: "event ID",
+ event_json: {
+ origin: "origin server",
+ origin_server_ts: "time of send",
+ type: "event typ",
+ content: {
+ msgtype: "content type",
+ body: "content",
+ format: "format",
+ formatted_body: "formatted content",
+ algorithm: "algorithm",
+ },
+ },
+ },
+ },
connections: {
name: "Connections",
fields: {
diff --git a/src/synapse/dataProvider.js b/src/synapse/dataProvider.js
index 6d5f78d..560bdb9 100644
--- a/src/synapse/dataProvider.js
+++ b/src/synapse/dataProvider.js
@@ -72,6 +72,15 @@ const resourceMap = {
method: "POST",
}),
},
+ reports: {
+ path: "/_synapse/admin/v1/event_reports",
+ map: er => ({
+ ...er,
+ id: er.id,
+ }),
+ data: "event_reports",
+ total: json => json.total,
+ },
devices: {
map: d => ({
...d,