diff --git a/src/App.js b/src/App.js index 58cdb22..1d61d84 100644 --- a/src/App.js +++ b/src/App.js @@ -8,26 +8,15 @@ import { import polyglotI18nProvider from "ra-i18n-polyglot"; 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 users from "./components/users"; +import rooms from "./components/rooms"; +import userMediaStats from "./components/statistics"; +import reports from "./components/EventReports"; +import roomDirectory from "./components/RoomDirectory"; +import destinations from "./components/destinations"; +import registrationToken from "./components/RegistrationTokens"; import LoginPage from "./components/LoginPage"; -import ConfirmationNumberIcon from "@mui/icons-material/ConfirmationNumber"; -import CloudQueueIcon from "@mui/icons-material/CloudQueue"; -import EqualizerIcon from "@mui/icons-material/Equalizer"; -import UserIcon from "@mui/icons-material/Group"; -import { UserMediaStatsList } from "./components/statistics"; -import RoomIcon from "@mui/icons-material/ViewList"; -import ReportIcon from "@mui/icons-material/Warning"; -import FolderSharedIcon from "@mui/icons-material/FolderShared"; -import { DestinationList, DestinationShow } from "./components/destinations"; import { ImportFeature } from "./components/ImportFeature"; -import { - RegistrationTokenCreate, - RegistrationTokenEdit, - RegistrationTokenList, -} from "./components/RegistrationTokens"; -import { RoomDirectoryList } from "./components/RoomDirectory"; import { Route } from "react-router-dom"; import germanMessages from "./i18n/de"; import englishMessages from "./i18n/en"; @@ -59,43 +48,13 @@ const App = () => ( } /> - - - - - - - + + + + + + + diff --git a/src/components/EventReports.js b/src/components/EventReports.js index c4b05a4..e18a328 100644 --- a/src/components/EventReports.js +++ b/src/components/EventReports.js @@ -13,6 +13,7 @@ import { useTranslate, } from "react-admin"; import PageviewIcon from "@mui/icons-material/Pageview"; +import ReportIcon from "@mui/icons-material/Warning"; import ViewListIcon from "@mui/icons-material/ViewList"; const date_format = { @@ -98,24 +99,31 @@ export const ReportShow = props => { ); }; -export const ReportList = () => { - return ( - } - sort={{ field: "received_ts", order: "DESC" }} - > - - - - - - - - - ); +export const ReportList = () => ( + } + sort={{ field: "received_ts", order: "DESC" }} + > + + + + + + + + +); + +const resource = { + name: "reports", + icon: ReportIcon, + list: ReportList, + show: ReportShow, }; + +export default resource; diff --git a/src/components/ImportFeature.js b/src/components/ImportFeature.js index d30d302..c0066fe 100644 --- a/src/components/ImportFeature.js +++ b/src/components/ImportFeature.js @@ -32,7 +32,7 @@ function TranslatableOption({ value, text }) { return ; } -const FilePicker = props => { +const FilePicker = () => { const [values, setValues] = useState(null); const [error, setError] = useState(null); const [stats, setStats] = useState(null); @@ -191,7 +191,7 @@ const FilePicker = props => { return true; }; - const runImport = async e => { + const runImport = async _e => { if (progress !== null) { notify("import_users.errors.already_in_progress"); return; @@ -307,7 +307,7 @@ const FilePicker = props => { let retries = 0; const submitRecord = recordData => { return dataProvider.getOne("users", { id: recordData.id }).then( - async alreadyExists => { + async _alreadyExists => { if (LOGGING) console.log("already existed"); if (useridMode === "update" || conflictMode === "skip") { @@ -332,7 +332,7 @@ const FilePicker = props => { } } }, - async okToSubmit => { + async _okToSubmit => { if (LOGGING) console.log( "OK to create record " + diff --git a/src/components/LoginPage.js b/src/components/LoginPage.js index 33eb6be..8585f69 100644 --- a/src/components/LoginPage.js +++ b/src/components/LoginPage.js @@ -307,9 +307,13 @@ const LoginPage = () => { - - - + {loading ? ( + + ) : ( + + + + )} {translate("synapseadmin.auth.welcome")} @@ -339,7 +343,6 @@ const LoginPage = () => { disabled={loading || !supportPassAuth} fullWidth > - {loading && } {translate("ra.auth.sign_in")} diff --git a/src/components/RegistrationTokens.js b/src/components/RegistrationTokens.js index e0ee85d..bd4d4f9 100644 --- a/src/components/RegistrationTokens.js +++ b/src/components/RegistrationTokens.js @@ -6,7 +6,6 @@ import { DateField, DateTimeInput, Edit, - Filter, List, maxValue, number, @@ -19,6 +18,7 @@ import { TextField, Toolbar, } from "react-admin"; +import RegistrationTokenIcon from "@mui/icons-material/ConfirmationNumber"; const date_format = { year: "numeric", @@ -54,36 +54,30 @@ const dateFormatter = v => { return `${year}-${month}-${day}T${hour}:${minute}`; }; -const RegistrationTokenFilter = props => ( - - - -); +const registrationTokenFilters = []; -export const RegistrationTokenList = props => { - return ( - } - filterDefaultValues={{ valid: true }} - pagination={false} - perPage={500} - > - - - - - - - - - ); -}; +export const RegistrationTokenList = props => ( + + + + + + + + + +); export const RegistrationTokenCreate = props => ( @@ -117,24 +111,32 @@ export const RegistrationTokenCreate = props => ( ); -export const RegistrationTokenEdit = props => { - return ( - - - - - - - - - - ); +export const RegistrationTokenEdit = () => ( + + + + + + + + + +); + +const resource = { + name: "users", + icon: RegistrationTokenIcon, + list: RegistrationTokenList, + edit: RegistrationTokenEdit, + create: RegistrationTokenCreate, }; + +export default resource; diff --git a/src/components/RoomDirectory.js b/src/components/RoomDirectory.js index 0744aa2..34f2ded 100644 --- a/src/components/RoomDirectory.js +++ b/src/components/RoomDirectory.js @@ -1,5 +1,4 @@ -import React, { Fragment } from "react"; -import FolderSharedIcon from "@mui/icons-material/FolderShared"; +import React from "react"; import { BooleanField, BulkDeleteButton, @@ -23,6 +22,7 @@ import { useUnselectAll, } from "react-admin"; import { useMutation } from "react-query"; +import RoomDirectoryIcon from "@mui/icons-material/FolderShared"; import AvatarField from "./AvatarField"; const RoomDirectoryPagination = () => ( @@ -44,7 +44,7 @@ export const RoomDirectoryDeleteButton = () => { smart_count: 1, })} resource="room_directory" - icon={} + icon={} /> ); }; @@ -56,7 +56,7 @@ export const RoomDirectoryBulkDeleteButton = () => ( confirmTitle="resources.room_directory.action.title" confirmContent="resources.room_directory.action.content" resource="room_directory" - icon={} + icon={} /> ); @@ -91,7 +91,7 @@ export const RoomDirectoryBulkSaveButton = () => { onClick={mutate} disabled={isloading} > - + ); }; @@ -102,16 +102,16 @@ export const RoomDirectorySaveButton = () => { const refresh = useRefresh(); const [create, { isloading }] = useCreate(); - const handleSend = values => { + const handleSend = () => { create( "room_directory", { data: { id: record.id } }, { - onSuccess: () => { + onSuccess: _data => { notify("resources.room_directory.action.send_success"); refresh(); }, - onError: () => + onError: _error => notify("resources.room_directory.action.send_failure", { type: "error", }), @@ -125,16 +125,12 @@ export const RoomDirectorySaveButton = () => { onClick={handleSend} disabled={isloading} > - + ); }; -const RoomDirectoryBulkActionButtons = () => ( - - - -); +const RoomDirectoryBulkActionButtons = () => ; const RoomDirectoryListActions = () => ( @@ -198,3 +194,11 @@ export const RoomDirectoryList = () => ( ); + +const resource = { + name: "room_directory", + icon: RoomDirectoryIcon, + list: RoomDirectoryList, +}; + +export default resource; diff --git a/src/components/ServerNotices.js b/src/components/ServerNotices.js index 0514e3e..54c5660 100644 --- a/src/components/ServerNotices.js +++ b/src/components/ServerNotices.js @@ -1,4 +1,4 @@ -import React, { Fragment, useState } from "react"; +import React, { useState } from "react"; import { Button, SaveButton, @@ -91,7 +91,7 @@ export const ServerNoticeButton = () => { }; return ( - + <> @@ -232,13 +232,13 @@ export const ProtectMediaButton = () => { })} >
-
)} -
+ ); }; @@ -247,7 +247,7 @@ export const QuarantineMediaButton = () => { const translate = useTranslate(); const refresh = useRefresh(); const notify = useNotify(); - const [create, { loading }] = useCreate(); + const [create, { isLoading }] = useCreate(); const [deleteOne] = useDelete(); if (!record) return null; @@ -272,7 +272,7 @@ export const QuarantineMediaButton = () => { const handleRemoveQuarantaine = () => { deleteOne( "quarantine_media", - { id: record.id, previousData: record }, + { id: record.id }, { onSuccess: () => { notify("resources.quarantine_media.action.send_success"); @@ -287,7 +287,7 @@ export const QuarantineMediaButton = () => { }; return ( - + <> {record.safe_from_quarantine && ( { })} >
-
@@ -308,7 +308,11 @@ export const QuarantineMediaButton = () => { })} >
-
@@ -321,12 +325,12 @@ export const QuarantineMediaButton = () => { })} >
-
)} -
+ ); }; diff --git a/src/components/rooms.js b/src/components/rooms.js index 0a23b6a..d9e46a5 100644 --- a/src/components/rooms.js +++ b/src/components/rooms.js @@ -1,4 +1,4 @@ -import React, { Fragment } from "react"; +import React from "react"; import { BooleanField, BulkDeleteButton, @@ -7,7 +7,6 @@ import { DatagridConfigurable, DeleteButton, ExportButton, - Filter, FunctionField, List, NumberField, @@ -35,6 +34,7 @@ import UserIcon from "@mui/icons-material/Group"; import ViewListIcon from "@mui/icons-material/ViewList"; import VisibilityIcon from "@mui/icons-material/Visibility"; import EventIcon from "@mui/icons-material/Event"; +import RoomIcon from "@mui/icons-material/ViewList"; import { RoomDirectoryBulkDeleteButton, RoomDirectoryBulkSaveButton, @@ -274,7 +274,7 @@ export const RoomShow = () => { }; const RoomBulkActionButtons = () => ( - + <> ( confirmContent="resources.rooms.action.erase.content" mutationMode="pessimistic" /> - + ); -const RoomFilter = props => ( - - - -); +const roomFilters = []; const RoomListActions = () => ( @@ -298,14 +294,15 @@ const RoomListActions = () => ( ); -export const RoomList = () => { +export const RoomList = props => { const theme = useTheme(); return ( } sort={{ field: "name", order: "ASC" }} - filters={} + filters={roomFilters} actions={} > { ); }; + +const resource = { + name: "rooms", + icon: RoomIcon, + list: RoomList, + show: RoomShow, +}; + +export default resource; diff --git a/src/components/statistics.js b/src/components/statistics.js index 4872f40..a277c20 100644 --- a/src/components/statistics.js +++ b/src/components/statistics.js @@ -3,7 +3,6 @@ import { cloneElement } from "react"; import { Datagrid, ExportButton, - Filter, List, NumberField, Pagination, @@ -13,6 +12,7 @@ import { TopToolbar, useListContext, } from "react-admin"; +import EqualizerIcon from "@mui/icons-material/Equalizer"; import { DeleteMediaButton } from "./media"; const ListActions = props => { @@ -45,32 +45,34 @@ const UserMediaStatsPagination = () => ( ); -const UserMediaStatsFilter = props => ( - - - +const userMediaStatsFilters = []; + +export const UserMediaStatsList = () => ( + } + filters={userMediaStatsFilters} + pagination={} + sort={{ field: "media_length", order: "DESC" }} + > + "/users/" + id + "/media"} + bulkActionButtons={false} + > + + + + + + ); -export const UserMediaStatsList = props => { - return ( - } - filters={} - pagination={} - sort={{ field: "media_length", order: "DESC" }} - > - "/users/" + id + "/media"} - bulkActionButtons={false} - > - - - - - - - ); +const resource = { + name: "user_media_statistics", + icon: EqualizerIcon, + list: UserMediaStatsList, }; + +export default resource; diff --git a/src/components/users.js b/src/components/users.js index e64157c..995e5dd 100644 --- a/src/components/users.js +++ b/src/components/users.js @@ -1,4 +1,4 @@ -import React, { cloneElement, Fragment } from "react"; +import React, { cloneElement } from "react"; import AssignmentIndIcon from "@mui/icons-material/AssignmentInd"; import ContactMailIcon from "@mui/icons-material/ContactMail"; import DevicesIcon from "@mui/icons-material/Devices"; @@ -7,6 +7,7 @@ import NotificationsIcon from "@mui/icons-material/Notifications"; import PermMediaIcon from "@mui/icons-material/PermMedia"; import PersonPinIcon from "@mui/icons-material/PersonPin"; import SettingsInputComponentIcon from "@mui/icons-material/SettingsInputComponent"; +import UserIcon from "@mui/icons-material/Group"; import ViewListIcon from "@mui/icons-material/ViewList"; import { ArrayInput, @@ -17,7 +18,6 @@ import { Create, Edit, List, - Filter, Toolbar, SimpleForm, SimpleFormIterator, @@ -125,60 +125,55 @@ const UserPagination = () => ( ); -const UserFilter = props => ( - - - - - -); +const userFilters = [ + , + , + , +]; -const UserBulkActionButtons = props => ( - - +const UserBulkActionButtons = () => ( + <> + - + ); -export const UserList = props => { - return ( - } - filterDefaultValues={{ guests: true, deactivated: false }} - sort={{ field: "name", order: "ASC" }} - actions={} - pagination={} - > - }> - - - - - - - - - - ); -}; +export const UserList = () => ( + } + pagination={} + > + }> + + + + + + + + + +); // https://matrix.org/docs/spec/appendices#user-identifiers // here only local part of user_id @@ -302,7 +297,7 @@ export const UserCreate = props => ( ); -const UserTitle = props => { +const UserTitle = () => { const record = useRecordContext(); const translate = useTranslate(); return ( @@ -529,3 +524,13 @@ export const UserEdit = props => { ); }; + +const resource = { + name: "users", + icon: UserIcon, + list: UserList, + edit: UserEdit, + create: UserCreate, +}; + +export default resource; diff --git a/src/synapse/dataProvider.js b/src/synapse/dataProvider.js index 4a7e3cb..46be560 100644 --- a/src/synapse/dataProvider.js +++ b/src/synapse/dataProvider.js @@ -98,7 +98,7 @@ const resourceMap = { }), delete: params => ({ endpoint: `/_synapse/admin/v2/users/${encodeURIComponent( - params.user_id + params.meta.user_id )}/devices/${params.id}`, }), }, @@ -184,9 +184,9 @@ const resourceMap = { delete: params => ({ endpoint: `/_synapse/admin/v1/media/${localStorage.getItem( "home_server" - )}/delete?before_ts=${params.before_ts}&size_gt=${ - params.size_gt - }&keep_profiles=${params.keep_profiles}`, + )}/delete?before_ts=${params.meta.before_ts}&size_gt=${ + params.meta.size_gt + }&keep_profiles=${params.meta.keep_profiles}`, method: "POST", }), }, @@ -197,7 +197,7 @@ const resourceMap = { method: "POST", }), delete: params => ({ - endpoint: `/_synapse/admin/v1/media/unprotect/${params.media_id}`, + endpoint: `/_synapse/admin/v1/media/unprotect/${params.id}`, method: "POST", }), }, @@ -212,7 +212,7 @@ const resourceMap = { delete: params => ({ endpoint: `/_synapse/admin/v1/media/unquarantine/${localStorage.getItem( "home_server" - )}/${params.media_id}`, + )}/${params.id}`, method: "POST", }), }, @@ -534,7 +534,7 @@ const dataProvider = { const res = resourceMap[resource]; if ("delete" in res) { - const del = res["delete"](params.previousData); + const del = res["delete"](params); const endpoint_url = homeserver + del.endpoint; return jsonClient(endpoint_url, { method: "method" in del ? del.method : "DELETE", @@ -546,7 +546,7 @@ const dataProvider = { const endpoint_url = homeserver + res.path; return jsonClient(`${endpoint_url}/${params.id}`, { method: "DELETE", - body: JSON.stringify(params.previousData, filterNullValues), + body: JSON.stringify(params, filterNullValues), }).then(({ json }) => ({ data: json, }));