From b2fb2496ca6af7b894ff4713237e8b91a370e3f9 Mon Sep 17 00:00:00 2001 From: Johannes Kanefendt Date: Wed, 7 Jul 2021 14:35:22 +0200 Subject: [PATCH 1/4] Implemented ui option to block deleted rooms from being rejoined --- src/components/rooms.js | 126 +++++++++++++++++++++++++++++++++--- src/i18n/de.js | 5 ++ src/i18n/en.js | 5 ++ src/synapse/dataProvider.js | 2 +- 4 files changed, 128 insertions(+), 10 deletions(-) diff --git a/src/components/rooms.js b/src/components/rooms.js index d91db05..74e89c8 100644 --- a/src/components/rooms.js +++ b/src/components/rooms.js @@ -1,4 +1,6 @@ -import React, { Fragment } from "react"; +import React, { Fragment, useState } from "react"; +import classnames from "classnames"; +import { fade } from "@material-ui/core/styles/colorManipulator"; import { connect } from "react-redux"; import { BooleanField, @@ -21,6 +23,14 @@ import { TopToolbar, useRecordContext, useTranslate, + useRedirect, + Toolbar, + SaveButton, + Button, + SimpleForm, + BooleanInput, + useDelete, + useNotify, } from "react-admin"; import get from "lodash/get"; import PropTypes from "prop-types"; @@ -33,7 +43,13 @@ import PageviewIcon from "@material-ui/icons/Pageview"; import UserIcon from "@material-ui/icons/Group"; import ViewListIcon from "@material-ui/icons/ViewList"; import VisibilityIcon from "@material-ui/icons/Visibility"; +import IconCancel from "@material-ui/icons/Cancel"; import EventIcon from "@material-ui/icons/Event"; +import Dialog from "@material-ui/core/Dialog"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import DeleteIcon from "@material-ui/icons/Delete"; import { RoomDirectoryBulkDeleteButton, RoomDirectoryBulkSaveButton, @@ -46,6 +62,16 @@ const useStyles = makeStyles(theme => ({ fontFamily: "Roboto, Helvetica, Arial, sans-serif", margin: "0.5em", }, + deleteButton: { + color: theme.palette.error.main, + "&:hover": { + backgroundColor: fade(theme.palette.error.main, 0.12), + // Reset on mouse devices + "@media (hover: none)": { + backgroundColor: "transparent", + }, + }, + }, })); const RoomPagination = props => ( @@ -106,14 +132,7 @@ const RoomShowActions = ({ basePath, data, resource }) => { {roomDirectoryStatus === true && ( )} - + ); }; @@ -408,3 +427,92 @@ function mapStateToProps(state) { } export const RoomList = connect(mapStateToProps)(FilterableRoomList); + +const DeleteRoomDialog = ({ open, loading, onClose, onSend }) => { + const translate = useTranslate(); + + const DeleteRoomToolbar = props => { + return ( + + } + /> + + + ); + }; + + return ( + + + {translate("resources.rooms.action.erase.title")} + + + + {translate("resources.rooms.action.erase.content")} + + } + submitOnEnter={false} + redirect={false} + save={onSend} + > + + + + + ); +}; + +export const DeleteRoomButton = props => { + const classes = useStyles(props); + const [open, setOpen] = useState(false); + const notify = useNotify(); + const redirect = useRedirect(); + const [deleteOne, { loading }] = useDelete("rooms"); + const record = useRecordContext(props); + + const handleDialogOpen = () => setOpen(true); + const handleDialogClose = () => setOpen(false); + + const handleSend = values => { + deleteOne( + { payload: { id: record.id, ...values } }, + { + onSuccess: () => { + notify("resources.rooms.action.erase.send_success"); + handleDialogClose(); + redirect('/rooms'); + }, + onFailure: () => + notify("resources.rooms.action.erase.send_failure", "error"), + } + ); + }; + + return ( + + + + + ); +}; diff --git a/src/i18n/de.js b/src/i18n/de.js index 385c479..708c9c2 100644 --- a/src/i18n/de.js +++ b/src/i18n/de.js @@ -180,6 +180,11 @@ const de = { title: "Raum löschen", content: "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!", + fields: { + block: "Raum für erneute Beitritte sperren", + }, + send_success: "Der Raum wurde gelöscht", + send_failure: "Der Raum konnte nicht gelöscht werden", }, }, }, diff --git a/src/i18n/en.js b/src/i18n/en.js index 5f38c8b..5c4a2eb 100644 --- a/src/i18n/en.js +++ b/src/i18n/en.js @@ -177,6 +177,11 @@ const en = { title: "Delete room", content: "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!", + fields: { + block: "Block room from being rejoined", + }, + send_success: "The room has been deleted", + send_failure: "The room could not be deleted", }, }, reports: { diff --git a/src/synapse/dataProvider.js b/src/synapse/dataProvider.js index 3bfa4e7..4b54e09 100644 --- a/src/synapse/dataProvider.js +++ b/src/synapse/dataProvider.js @@ -68,7 +68,7 @@ const resourceMap = { }, delete: params => ({ endpoint: `/_synapse/admin/v1/rooms/${params.id}`, - body: { block: false }, + body: { block: !!params.block }, }), }, reports: { From a7f07088457e94987db5e2840fb9563cdc66c5ad Mon Sep 17 00:00:00 2001 From: Johannes Kanefendt Date: Wed, 7 Jul 2021 15:09:19 +0200 Subject: [PATCH 2/4] Fixed english translations for room deletion --- src/i18n/en.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/i18n/en.js b/src/i18n/en.js index 5c4a2eb..c459df4 100644 --- a/src/i18n/en.js +++ b/src/i18n/en.js @@ -173,15 +173,17 @@ const en = { }, unencrypted: "Unencrypted", }, - erase: { - title: "Delete room", - content: - "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!", - fields: { - block: "Block room from being rejoined", + action: { + erase: { + title: "Delete room", + content: + "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!", + fields: { + block: "Block room from being rejoined", + }, + send_success: "The room has been deleted", + send_failure: "The room could not be deleted", }, - send_success: "The room has been deleted", - send_failure: "The room could not be deleted", }, }, reports: { From 235dee0af6b0731b3d742ef1838d36d51ba6e29a Mon Sep 17 00:00:00 2001 From: Johannes Kanefendt Date: Wed, 18 Aug 2021 09:59:13 +0200 Subject: [PATCH 3/4] Fix unused imports, coding style --- src/components/rooms.js | 3 +-- src/i18n/de.js | 2 +- src/i18n/en.js | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/rooms.js b/src/components/rooms.js index 74e89c8..1a40c81 100644 --- a/src/components/rooms.js +++ b/src/components/rooms.js @@ -7,7 +7,6 @@ import { BulkDeleteButton, DateField, Datagrid, - DeleteButton, Filter, List, NumberField, @@ -490,7 +489,7 @@ export const DeleteRoomButton = props => { onSuccess: () => { notify("resources.rooms.action.erase.send_success"); handleDialogClose(); - redirect('/rooms'); + redirect("/rooms"); }, onFailure: () => notify("resources.rooms.action.erase.send_failure", "error"), diff --git a/src/i18n/de.js b/src/i18n/de.js index 708c9c2..2f1c9aa 100644 --- a/src/i18n/de.js +++ b/src/i18n/de.js @@ -181,7 +181,7 @@ const de = { content: "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!", fields: { - block: "Raum für erneute Beitritte sperren", + block: "Raum für erneute Beitritte sperren", }, send_success: "Der Raum wurde gelöscht", send_failure: "Der Raum konnte nicht gelöscht werden", diff --git a/src/i18n/en.js b/src/i18n/en.js index c459df4..4b3ba5f 100644 --- a/src/i18n/en.js +++ b/src/i18n/en.js @@ -179,7 +179,7 @@ const en = { content: "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!", fields: { - block: "Block room from being rejoined", + block: "Block room from being rejoined", }, send_success: "The room has been deleted", send_failure: "The room could not be deleted", From 25dc6676983fdf96bda1c0e1cafab89754ba44cf Mon Sep 17 00:00:00 2001 From: Johannes Kanefendt Date: Fri, 20 Aug 2021 12:07:57 +0200 Subject: [PATCH 4/4] Move DeleteRoomButton and DeleteRoomDialog to separate file --- src/components/DeleteRoom.js | 128 +++++++++++++++++++++++++++++++++++ src/components/rooms.js | 107 +---------------------------- 2 files changed, 130 insertions(+), 105 deletions(-) create mode 100644 src/components/DeleteRoom.js diff --git a/src/components/DeleteRoom.js b/src/components/DeleteRoom.js new file mode 100644 index 0000000..bba877e --- /dev/null +++ b/src/components/DeleteRoom.js @@ -0,0 +1,128 @@ +import React, { Fragment, useState } from "react"; +import classnames from "classnames"; +import { fade } from "@material-ui/core/styles/colorManipulator"; +import { + useTranslate, + useRedirect, + Toolbar, + SaveButton, + Button, + SimpleForm, + BooleanInput, + useRecordContext, + useDelete, + useNotify, +} from "react-admin"; +import { makeStyles } from "@material-ui/core/styles"; +import IconCancel from "@material-ui/icons/Cancel"; +import DeleteIcon from "@material-ui/icons/Delete"; +import Dialog from "@material-ui/core/Dialog"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; + +const useStyles = makeStyles(theme => ({ + helper_forward_extremities: { + fontFamily: "Roboto, Helvetica, Arial, sans-serif", + margin: "0.5em", + }, + deleteButton: { + color: theme.palette.error.main, + "&:hover": { + backgroundColor: fade(theme.palette.error.main, 0.12), + // Reset on mouse devices + "@media (hover: none)": { + backgroundColor: "transparent", + }, + }, + }, +})); + +export const DeleteRoomDialog = ({ open, loading, onClose, onSend }) => { + const translate = useTranslate(); + + const DeleteRoomToolbar = props => { + return ( + + } + /> + + + ); + }; + + return ( + + + {translate("resources.rooms.action.erase.title")} + + + + {translate("resources.rooms.action.erase.content")} + + } + submitOnEnter={false} + redirect={false} + save={onSend} + > + + + + + ); +}; + +export const DeleteRoomButton = props => { + const classes = useStyles(props); + const [open, setOpen] = useState(false); + const notify = useNotify(); + const redirect = useRedirect(); + const [deleteOne, { loading }] = useDelete("rooms"); + const record = useRecordContext(props); + + const handleDialogOpen = () => setOpen(true); + const handleDialogClose = () => setOpen(false); + + const handleSend = values => { + deleteOne( + { payload: { id: record.id, ...values } }, + { + onSuccess: () => { + notify("resources.rooms.action.erase.send_success"); + handleDialogClose(); + redirect("/rooms"); + }, + onFailure: () => + notify("resources.rooms.action.erase.send_failure", "error"), + } + ); + }; + + return ( + + + + + ); +}; diff --git a/src/components/rooms.js b/src/components/rooms.js index 1a40c81..c8bf849 100644 --- a/src/components/rooms.js +++ b/src/components/rooms.js @@ -1,5 +1,4 @@ -import React, { Fragment, useState } from "react"; -import classnames from "classnames"; +import React, { Fragment } from "react"; import { fade } from "@material-ui/core/styles/colorManipulator"; import { connect } from "react-redux"; import { @@ -22,14 +21,6 @@ import { TopToolbar, useRecordContext, useTranslate, - useRedirect, - Toolbar, - SaveButton, - Button, - SimpleForm, - BooleanInput, - useDelete, - useNotify, } from "react-admin"; import get from "lodash/get"; import PropTypes from "prop-types"; @@ -42,19 +33,14 @@ import PageviewIcon from "@material-ui/icons/Pageview"; import UserIcon from "@material-ui/icons/Group"; import ViewListIcon from "@material-ui/icons/ViewList"; import VisibilityIcon from "@material-ui/icons/Visibility"; -import IconCancel from "@material-ui/icons/Cancel"; import EventIcon from "@material-ui/icons/Event"; -import Dialog from "@material-ui/core/Dialog"; -import DialogContent from "@material-ui/core/DialogContent"; -import DialogContentText from "@material-ui/core/DialogContentText"; -import DialogTitle from "@material-ui/core/DialogTitle"; -import DeleteIcon from "@material-ui/icons/Delete"; import { RoomDirectoryBulkDeleteButton, RoomDirectoryBulkSaveButton, RoomDirectoryDeleteButton, RoomDirectorySaveButton, } from "./RoomDirectory"; +import { DeleteRoomButton } from "./DeleteRoom"; const useStyles = makeStyles(theme => ({ helper_forward_extremities: { @@ -426,92 +412,3 @@ function mapStateToProps(state) { } export const RoomList = connect(mapStateToProps)(FilterableRoomList); - -const DeleteRoomDialog = ({ open, loading, onClose, onSend }) => { - const translate = useTranslate(); - - const DeleteRoomToolbar = props => { - return ( - - } - /> - - - ); - }; - - return ( - - - {translate("resources.rooms.action.erase.title")} - - - - {translate("resources.rooms.action.erase.content")} - - } - submitOnEnter={false} - redirect={false} - save={onSend} - > - - - - - ); -}; - -export const DeleteRoomButton = props => { - const classes = useStyles(props); - const [open, setOpen] = useState(false); - const notify = useNotify(); - const redirect = useRedirect(); - const [deleteOne, { loading }] = useDelete("rooms"); - const record = useRecordContext(props); - - const handleDialogOpen = () => setOpen(true); - const handleDialogClose = () => setOpen(false); - - const handleSend = values => { - deleteOne( - { payload: { id: record.id, ...values } }, - { - onSuccess: () => { - notify("resources.rooms.action.erase.send_success"); - handleDialogClose(); - redirect("/rooms"); - }, - onFailure: () => - notify("resources.rooms.action.erase.send_failure", "error"), - } - ); - }; - - return ( - - - - - ); -};