Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 19 additions & 17 deletions src/components/DeleteRoomButton.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ActionCheck from "@mui/icons-material/CheckCircle";
import ActionDelete from "@mui/icons-material/Delete";
import AlertError from "@mui/icons-material/ErrorOutline";
import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material";
import { Button, Tooltip, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material";
import { Fragment, useState } from "react";
import {
SimpleForm,
Expand Down Expand Up @@ -61,22 +61,24 @@ const DeleteRoomButton: React.FC<DeleteRoomButtonProps> = props => {

return (
<Fragment>
<Button
onClick={handleDialogOpen}
disabled={isLoading}
className={"ra-delete-button"}
key="button"
size="small"
sx={{
"&.MuiButton-sizeSmall": {
lineHeight: 1.5,
},
}}
color={"error"}
startIcon={<ActionDelete />}
>
{translate("ra.action.delete")}
</Button>
<Tooltip title={translate("ra.action.delete")}>
<Button
onClick={handleDialogOpen}
disabled={isLoading}
className={"ra-delete-button"}
key="button"
size="small"
sx={{
"&.MuiButton-sizeSmall": {
lineHeight: 1.5,
},
}}
color={"error"}
startIcon={<ActionDelete />}
>
{translate("ra.action.delete")}
</Button>
</Tooltip>
<Dialog open={open} onClose={handleDialogClose}>
<DialogTitle>{translate(props.confirmTitle)}</DialogTitle>
<DialogContent>
Expand Down
36 changes: 19 additions & 17 deletions src/components/DeleteUserButton.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ActionCheck from "@mui/icons-material/CheckCircle";
import ActionDelete from "@mui/icons-material/Delete";
import AlertError from "@mui/icons-material/ErrorOutline";
import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material";
import { Tooltip, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material";
import { Fragment, useState } from "react";
import {
SimpleForm,
Expand Down Expand Up @@ -67,22 +67,24 @@ const DeleteUserButton: React.FC<DeleteUserButtonProps> = props => {

return (
<Fragment>
<Button
onClick={handleDialogOpen}
disabled={isLoading}
className={"ra-delete-button"}
key="button"
size="small"
sx={{
"&.MuiButton-sizeSmall": {
lineHeight: 1.5,
},
}}
color={"error"}
startIcon={<ActionDelete />}
>
{translate("ra.action.delete")}
</Button>
<Tooltip title={translate("ra.action.delete")}>
<Button
onClick={handleDialogOpen}
disabled={isLoading}
className={"ra-delete-button"}
key="button"
size="small"
sx={{
"&.MuiButton-sizeSmall": {
lineHeight: 1.5,
},
}}
color={"error"}
startIcon={<ActionDelete />}
>
{translate("ra.action.delete")}
</Button>
</Tooltip>
<Dialog open={open} onClose={handleDialogClose}>
<DialogTitle>{translate(props.confirmTitle)}</DialogTitle>
<DialogContent>
Expand Down
33 changes: 20 additions & 13 deletions src/components/DeviceRemoveButton.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import { Tooltip } from "@mui/material";
import { DeleteWithConfirmButton, DeleteWithConfirmButtonProps, useRecordContext } from "react-admin";
import { useTranslate } from "react-admin";

import { isASManaged } from "../utils/mxid";

export const DeviceRemoveButton = (props: DeleteWithConfirmButtonProps) => {
const translate = useTranslate();
const record = useRecordContext();
if (!record) return null;

Expand All @@ -12,19 +15,23 @@ export const DeviceRemoveButton = (props: DeleteWithConfirmButtonProps) => {
}

return (
<DeleteWithConfirmButton
{...props}
label="ra.action.remove"
confirmTitle="resources.devices.action.erase.title"
confirmContent="resources.devices.action.erase.content"
mutationMode="pessimistic"
redirect={false}
disabled={isASManagedUser}
translateOptions={{
id: record.id,
name: record.display_name ? record.display_name : record.id,
}}
/>
<Tooltip
title={isASManagedUser ? translate("resources.devices.action.erase.disabled") : translate("ra.action.delete")}
>
<DeleteWithConfirmButton
{...props}
label="ra.action.remove"
confirmTitle="resources.devices.action.erase.title"
confirmContent="resources.devices.action.erase.content"
mutationMode="pessimistic"
redirect={false}
disabled={isASManagedUser}
translateOptions={{
id: record.id,
name: record.display_name ? record.display_name : record.id,
}}
/>
</Tooltip>
);
};

Expand Down
11 changes: 6 additions & 5 deletions src/components/ExperimentalFeatures.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { Stack, Switch, Typography } from "@mui/material";
import { Tooltip, Stack, Switch, Typography } from "@mui/material";
import { useState, useEffect } from "react";
import { useRecordContext } from "react-admin";
import { useNotify } from "react-admin";
import { useDataProvider } from "react-admin";
import { useRecordContext, useTranslate, useNotify, useDataProvider } from "react-admin";

import { ExperimentalFeaturesModel, SynapseDataProvider } from "../synapse/dataProvider";

Expand All @@ -15,6 +13,7 @@ const ExperimentalFeatureRow = (props: {
featureValue: boolean;
updateFeature: (feature_name: string, feature_value: boolean) => void;
}) => {
const translate = useTranslate();
const featureKey = props.featureKey;
const featureValue = props.featureValue;
const featureDescription = experimentalFeaturesMap[featureKey] ?? "";
Expand All @@ -34,7 +33,9 @@ const ExperimentalFeatureRow = (props: {
padding: 2,
}}
>
<Switch checked={checked} onChange={handleChange} />
<Tooltip title={translate("resources.experimental_features.action.toggle")}>
<Switch checked={checked} onChange={handleChange} />
</Tooltip>
<Stack>
<Typography
variant="subtitle1"
Expand Down
125 changes: 80 additions & 45 deletions src/components/media.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,14 @@ const DeleteMediaDialog = ({ open, onClose, onSubmit }) => {

const DeleteMediaToolbar = (props: ToolbarProps) => (
<Toolbar {...props}>
<SaveButton label="delete_media.action.send" icon={<DeleteSweepIcon />} />
<Button label="ra.action.cancel" onClick={onClose}>
<IconCancel />
</Button>
<Tooltip title={translate("delete_media.helper.send")}>
<SaveButton label="delete_media.action.send" icon={<DeleteSweepIcon />} />
</Tooltip>
<Tooltip title={translate("ra.action.cancel")}>
<Button label="ra.action.cancel" onClick={onClose}>
<IconCancel />
</Button>
</Tooltip>
</Toolbar>
);

Expand All @@ -54,9 +58,20 @@ const DeleteMediaDialog = ({ open, onClose, onSubmit }) => {
<DialogContent>
<DialogContentText>{translate("delete_media.helper.send")}</DialogContentText>
<SimpleForm toolbar={<DeleteMediaToolbar />} onSubmit={onSubmit}>
<DateTimeInput source="before_ts" label="delete_media.fields.before_ts" defaultValue={0} parse={dateParser} />
<NumberInput source="size_gt" label="delete_media.fields.size_gt" defaultValue={0} min={0} step={1024} />
<BooleanInput source="keep_profiles" label="delete_media.fields.keep_profiles" defaultValue={true} />
<Tooltip title={translate("delete_media.helper.before_ts")}>
<DateTimeInput
source="before_ts"
label="delete_media.fields.before_ts"
defaultValue={0}
parse={dateParser}
/>
</Tooltip>
<Tooltip title={translate("delete_media.helper.size_gt")}>
<NumberInput source="size_gt" label="delete_media.fields.size_gt" defaultValue={0} min={0} step={1024} />
</Tooltip>
<Tooltip title={translate("delete_media.helper.keep_profiles")}>
<BooleanInput source="keep_profiles" label="delete_media.fields.keep_profiles" defaultValue={true} />
</Tooltip>
</SimpleForm>
</DialogContent>
</Dialog>
Expand All @@ -67,6 +82,7 @@ export const DeleteMediaButton = (props: ButtonProps) => {
const theme = useTheme();
const [open, setOpen] = useState(false);
const notify = useNotify();
const translate = useTranslate();
const dataProvider = useDataProvider<SynapseDataProvider>();
const { mutate: deleteMedia, isPending } = useMutation({
mutationFn: (values: DeleteMediaParams) => dataProvider.deleteMedia(values),
Expand All @@ -86,24 +102,26 @@ export const DeleteMediaButton = (props: ButtonProps) => {

return (
<>
<Button
{...props}
label="delete_media.action.send"
onClick={openDialog}
disabled={isPending}
sx={{
color: theme.palette.error.main,
"&:hover": {
backgroundColor: alpha(theme.palette.error.main, 0.12),
// Reset on mouse devices
"@media (hover: none)": {
backgroundColor: "transparent",
<Tooltip title={translate("delete_media.helper.send")}>
<Button
{...props}
label="delete_media.action.send"
onClick={openDialog}
disabled={isPending}
sx={{
color: theme.palette.error.main,
"&:hover": {
backgroundColor: alpha(theme.palette.error.main, 0.12),
// Reset on mouse devices
"@media (hover: none)": {
backgroundColor: "transparent",
},
},
},
}}
>
<DeleteSweepIcon />
</Button>
}}
>
<DeleteSweepIcon />
</Button>
</Tooltip>
<DeleteMediaDialog open={open} onClose={closeDialog} onSubmit={deleteMedia} />
</>
);
Expand All @@ -114,10 +132,14 @@ const PurgeRemoteMediaDialog = ({ open, onClose, onSubmit }) => {

const PurgeRemoteMediaToolbar = (props: ToolbarProps) => (
<Toolbar {...props}>
<SaveButton label="purge_remote_media.action.send" icon={<DeleteSweepIcon />} />
<Button label="ra.action.cancel" onClick={onClose}>
<IconCancel />
</Button>
<Tooltip title={translate("purge_remote_media.helper.send")}>
<SaveButton label="purge_remote_media.action.send" icon={<DeleteSweepIcon />} />
</Tooltip>
<Tooltip title={translate("ra.action.cancel")}>
<Button label="ra.action.cancel" onClick={onClose}>
<IconCancel />
</Button>
</Tooltip>
</Toolbar>
);

Expand All @@ -142,6 +164,7 @@ const PurgeRemoteMediaDialog = ({ open, onClose, onSubmit }) => {
export const PurgeRemoteMediaButton = (props: ButtonProps) => {
const [open, setOpen] = useState(false);
const notify = useNotify();
const translate = useTranslate();
const dataProvider = useDataProvider<SynapseDataProvider>();
const { mutate: purgeRemoteMedia, isPending } = useMutation({
mutationFn: (values: DeleteMediaParams) => dataProvider.purgeRemoteMedia(values),
Expand All @@ -161,22 +184,24 @@ export const PurgeRemoteMediaButton = (props: ButtonProps) => {

return (
<>
<Button
{...props}
label="purge_remote_media.action.send"
onClick={openDialog}
disabled={isPending}
sx={{
"&:hover": {
// Reset on mouse devices
"@media (hover: none)": {
backgroundColor: "transparent",
<Tooltip title={translate("purge_remote_media.helper.send")}>
<Button
{...props}
label="purge_remote_media.action.send"
onClick={openDialog}
disabled={isPending}
sx={{
"&:hover": {
// Reset on mouse devices
"@media (hover: none)": {
backgroundColor: "transparent",
},
},
},
}}
>
<DeleteSweepIcon />
</Button>
}}
>
<DeleteSweepIcon />
</Button>
</Tooltip>
<PurgeRemoteMediaDialog open={open} onClose={closeDialog} onSubmit={purgeRemoteMedia} />
</>
);
Expand Down Expand Up @@ -452,6 +477,7 @@ export const ViewMediaButton = ({ mxcURL, label, uploadName, mimetype }) => {
};

export const MediaIDField = ({ source }) => {
const translate = useTranslate();
const record = useRecordContext();
if (!record) {
return null;
Expand All @@ -474,10 +500,15 @@ export const MediaIDField = ({ source }) => {
mxcURL = `mxc://${homeserver}/${mediaID}`;
}

return <ViewMediaButton mxcURL={mxcURL} label={mediaID} uploadName={uploadName} mimetype={record.media_type} />;
return (
<Tooltip title={translate("resources.users_media.action.open")}>
<ViewMediaButton mxcURL={mxcURL} label={mediaID} uploadName={uploadName} mimetype={record.media_type} />
</Tooltip>
);
};

export const ReportMediaContent = ({ source }) => {
const translate = useTranslate();
const record = useRecordContext();
if (!record) {
return null;
Expand All @@ -493,5 +524,9 @@ export const ReportMediaContent = ({ source }) => {
uploadName = decodeURLComponent(get(record, "event_json.content.body")?.toString());
}

return <ViewMediaButton mxcURL={mxcURL} label={mxcURL} uploadName={uploadName} mimetype={record.media_type} />;
return (
<Tooltip title={translate("resources.users_media.action.open")}>
<ViewMediaButton mxcURL={mxcURL} label={mxcURL} uploadName={uploadName} mimetype={record.media_type} />
</Tooltip>
);
};