From 009ce803e2e5b23cfd7b44fcfb15460f85e23f4d Mon Sep 17 00:00:00 2001 From: Dirk Klimpel <5740567+dklimpel@users.noreply.github.com> Date: Wed, 6 May 2020 09:03:33 +0200 Subject: [PATCH] Add ServerNoticeButton to UserBulkActionButtons (#41) This adds the button to send "Server Notices" to many users at once. --- src/components/ServerNotices.js | 48 +++++++++++++++++++++++++++++++++ src/components/users.js | 3 ++- src/synapse/dataProvider.js | 23 ++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/components/ServerNotices.js b/src/components/ServerNotices.js index a0f37da..2a3e8bd 100644 --- a/src/components/ServerNotices.js +++ b/src/components/ServerNotices.js @@ -7,8 +7,10 @@ import { Toolbar, required, useCreate, + useMutation, useNotify, useTranslate, + useUnselectAll, } from "react-admin"; import MessageIcon from "@material-ui/icons/Message"; import IconCancel from "@material-ui/icons/Cancel"; @@ -98,3 +100,49 @@ export const ServerNoticeButton = ({ record }) => { ); }; + +export const ServerNoticeBulkButton = ({ selectedIds }) => { + const [open, setOpen] = useState(false); + const notify = useNotify(); + const unselectAll = useUnselectAll(); + const [createMany, { loading }] = useMutation(); + + const handleDialogOpen = () => setOpen(true); + const handleDialogClose = () => setOpen(false); + + const handleSend = values => { + createMany( + { + type: "createMany", + resource: "servernotices", + payload: { ids: selectedIds, data: values }, + }, + { + onSuccess: ({ data }) => { + notify("resources.servernotices.action.send_success"); + unselectAll("users"); + handleDialogClose(); + }, + onFailure: error => + notify("resources.servernotices.action.send_failure", "error"), + } + ); + }; + + return ( + + + + + ); +}; diff --git a/src/components/users.js b/src/components/users.js index 8e6c75b..16167a0 100644 --- a/src/components/users.js +++ b/src/components/users.js @@ -30,7 +30,7 @@ import { useTranslate, Pagination, } from "react-admin"; -import { ServerNoticeButton } from "./ServerNotices"; +import { ServerNoticeButton, ServerNoticeBulkButton } from "./ServerNotices"; const UserPagination = props => ( @@ -51,6 +51,7 @@ const UserBulkActionButtons = props => { const translate = useTranslate(); return ( + { + console.log("createMany " + resource); + const homeserver = localStorage.getItem("base_url"); + if (!homeserver || !(resource in resourceMap)) return Promise.reject(); + + const res = resourceMap[resource]; + if (!("create" in res)) return Promise.reject(); + + return Promise.all( + params.ids.map(id => { + params.data.id = id; + const cre = res["create"](params.data); + const endpoint_url = homeserver + cre.endpoint; + return jsonClient(endpoint_url, { + method: cre.method, + body: JSON.stringify(cre.body, filterNullValues), + }); + }) + ).then(responses => ({ + data: responses.map(({ json }) => json), + })); + }, + delete: (resource, params) => { console.log("delete " + resource); const homeserver = localStorage.getItem("base_url");