Compare commits

22 Commits

Author SHA1 Message Date
Aine
319c7aa33a In-App Docs: tooltips 2025-05-20 12:16:40 +03:00
Aine
5bec4c71ea update yarn.lock 2025-05-19 12:34:38 +03:00
Aine
245dadc470 Merge pull request #562 from etkecc/dependabot/npm_and_yarn/react-hook-form-7.56.4
Bump react-hook-form from 7.56.3 to 7.56.4
2025-05-19 09:30:43 +00:00
Aine
08cde13fd4 Merge pull request #561 from etkecc/dependabot/npm_and_yarn/types/react-19.1.4
Bump @types/react from 19.1.3 to 19.1.4
2025-05-19 09:30:30 +00:00
Aine
765456d233 Merge pull request #566 from etkecc/dependabot/npm_and_yarn/types/node-22.15.19
Bump @types/node from 22.15.17 to 22.15.19
2025-05-19 09:30:17 +00:00
Aine
b6bc4a2d43 Merge pull request #558 from etkecc/dependabot/npm_and_yarn/ts-jest-29.3.4
Bump ts-jest from 29.3.2 to 29.3.4
2025-05-19 09:29:29 +00:00
Aine
851478bbcb Merge pull request #563 from etkecc/dependabot/npm_and_yarn/tanstack/react-query-5.76.1
Bump @tanstack/react-query from 5.75.7 to 5.76.1
2025-05-19 09:29:11 +00:00
Aine
ff8e43631a Merge pull request #565 from etkecc/dependabot/npm_and_yarn/eslint-9.27.0
Bump eslint from 9.26.0 to 9.27.0
2025-05-19 09:28:54 +00:00
Aine
7b8a43b835 Merge pull request #567 from etkecc/dependabot/npm_and_yarn/typescript-eslint-8.32.1
Bump typescript-eslint from 8.32.0 to 8.32.1
2025-05-19 09:28:36 +00:00
Aine
bc0c186242 Merge pull request #572 from etkecc/dependabot/npm_and_yarn/ra-language-french-5.8.2
Bump ra-language-french from 5.8.0 to 5.8.2
2025-05-19 09:28:20 +00:00
dependabot[bot]
d5b9981bf0 Bump eslint from 9.26.0 to 9.27.0
Bumps [eslint](https://github.com/eslint/eslint) from 9.26.0 to 9.27.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.26.0...v9.27.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.27.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 09:24:01 +00:00
dependabot[bot]
7a8977a00c Bump @tanstack/react-query from 5.75.7 to 5.76.1
Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.75.7 to 5.76.1.
- [Release notes](https://github.com/TanStack/query/releases)
- [Commits](https://github.com/TanStack/query/commits/v5.76.1/packages/react-query)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.76.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 09:23:45 +00:00
dependabot[bot]
5297e56eca Bump react-hook-form from 7.56.3 to 7.56.4
Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.56.3 to 7.56.4.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.56.3...v7.56.4)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.56.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 09:23:43 +00:00
Aine
82ff610b89 Merge pull request #564 from etkecc/dependabot/npm_and_yarn/react-admin-5.8.2
Bump react-admin from 5.8.0 to 5.8.2
2025-05-19 09:21:18 +00:00
Aine
263f25303e Merge pull request #573 from etkecc/dependabot/github_actions/docker/build-push-action-6.17.0
Bump docker/build-push-action from 6.16.0 to 6.17.0
2025-05-19 09:20:56 +00:00
dependabot[bot]
2aa7cdcb97 Bump docker/build-push-action from 6.16.0 to 6.17.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.16.0 to 6.17.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](14487ce63c...1dc7386353)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 6.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 07:49:35 +00:00
dependabot[bot]
e3e8f028f4 Bump ra-language-french from 5.8.0 to 5.8.2
Bumps [ra-language-french](https://github.com/marmelab/react-admin) from 5.8.0 to 5.8.2.
- [Release notes](https://github.com/marmelab/react-admin/releases)
- [Changelog](https://github.com/marmelab/react-admin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/marmelab/react-admin/compare/v5.8.0...v5.8.2)

---
updated-dependencies:
- dependency-name: ra-language-french
  dependency-version: 5.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 07:41:47 +00:00
dependabot[bot]
f18523e0f2 Bump typescript-eslint from 8.32.0 to 8.32.1
Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.32.0 to 8.32.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.32.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.32.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 07:40:42 +00:00
dependabot[bot]
3533cbed93 Bump @types/node from 22.15.17 to 22.15.19
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.17 to 22.15.19.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 22.15.19
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 07:40:40 +00:00
dependabot[bot]
bf1cec2796 Bump react-admin from 5.8.0 to 5.8.2
Bumps [react-admin](https://github.com/marmelab/react-admin) from 5.8.0 to 5.8.2.
- [Release notes](https://github.com/marmelab/react-admin/releases)
- [Changelog](https://github.com/marmelab/react-admin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/marmelab/react-admin/compare/v5.8.0...v5.8.2)

---
updated-dependencies:
- dependency-name: react-admin
  dependency-version: 5.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 07:39:55 +00:00
dependabot[bot]
7005d08c7e Bump @types/react from 19.1.3 to 19.1.4
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 19.1.3 to 19.1.4.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 07:39:36 +00:00
dependabot[bot]
e15b45bcf9 Bump ts-jest from 29.3.2 to 29.3.4
Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.3.2 to 29.3.4.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/kulshekhar/ts-jest/compare/v29.3.2...v29.3.4)

---
updated-dependencies:
- dependency-name: ts-jest
  dependency-version: 29.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 07:39:05 +00:00
8 changed files with 310 additions and 625 deletions

View File

@@ -72,7 +72,7 @@ jobs:
type=raw,value=latest,enable=${{ github.ref_name == 'main' }}
type=semver,pattern={{raw}}
- name: Build and push
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0
with:
platforms: linux/amd64,linux/arm64
context: .

View File

@@ -18,13 +18,13 @@
"@testing-library/user-event": "^14.6.1",
"@types/jest": "^29.5.14",
"@types/lodash": "^4.17.16",
"@types/node": "^22.15.17",
"@types/node": "^22.15.19",
"@types/papaparse": "^5.3.16",
"@types/react": "^19.1.3",
"@types/react": "^19.1.4",
"@typescript-eslint/eslint-plugin": "^8.32.0",
"@typescript-eslint/parser": "^8.32.0",
"@vitejs/plugin-react": "^4.4.1",
"eslint": "^9.26.0",
"eslint": "^9.27.0",
"eslint-config-prettier": "^10.1.5",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
@@ -35,10 +35,10 @@
"jest-fetch-mock": "^3.0.3",
"prettier": "^3.5.3",
"react-test-renderer": "^19.1.0",
"ts-jest": "^29.3.2",
"ts-jest": "^29.3.4",
"ts-node": "^10.9.2",
"typescript": "^5.8.3",
"typescript-eslint": "^8.32.0",
"typescript-eslint": "^8.32.1",
"vite": "^6.3.5",
"vite-plugin-version-mark": "^0.1.4"
},
@@ -50,7 +50,7 @@
"@mui/icons-material": "^6.4.8",
"@mui/material": "^6.4.8",
"@mui/utils": "^7.1.0",
"@tanstack/react-query": "^5.75.7",
"@tanstack/react-query": "^5.76.1",
"history": "^5.3.0",
"jest-fixed-jsdom": "^0.0.9",
"lodash": "^4.17.21",
@@ -59,13 +59,13 @@
"ra-i18n-polyglot": "^5.4.4",
"ra-language-english": "^5.4.4",
"ra-language-farsi": "^5.1.0",
"ra-language-french": "^5.8.0",
"ra-language-french": "^5.8.2",
"ra-language-italian": "^3.13.1",
"ra-language-russian": "^5.4.3",
"react": "^19.1.0",
"react-admin": "^5.8.0",
"react-admin": "^5.8.2",
"react-dom": "^19.1.0",
"react-hook-form": "^7.56.3",
"react-hook-form": "^7.56.4",
"react-is": "^19.1.0",
"ts-jest-mock-import-meta": "^1.3.0",
"react-router": "^7.6.0",

View File

@@ -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,
@@ -63,22 +63,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>

View File

@@ -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,
@@ -69,22 +69,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>

View File

@@ -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;
@@ -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>
);
};

View File

@@ -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";
@@ -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] ?? "";
@@ -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"

View File

@@ -50,10 +50,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>
);
@@ -63,9 +67,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>
@@ -76,6 +91,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),
@@ -95,24 +111,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} />
</>
);
@@ -123,10 +141,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>
);
@@ -152,6 +174,7 @@ export const PurgeRemoteMediaButton = (props: ButtonProps) => {
const theme = useTheme();
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),
@@ -171,22 +194,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} />
</>
);
@@ -462,6 +487,7 @@ export const ViewMediaButton = ({ mxcURL, label, uploadName, mimetype }) => {
};
export const MediaIDField = ({ source }) => {
const translate = useTranslate();
const record = useRecordContext();
if (!record) {
return null;
@@ -484,10 +510,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;
@@ -503,5 +534,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>
);
};

674
yarn.lock

File diff suppressed because it is too large Load Diff