diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index d89eb42..44c2658 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -54,7 +54,7 @@ jobs: ghcr.io/${{ github.repository }} - name: Build and Push Tag - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . push: true diff --git a/.github/workflows/edge_ghpage.yml b/.github/workflows/edge_ghpage.yml index bdece29..a66d675 100644 --- a/.github/workflows/edge_ghpage.yml +++ b/.github/workflows/edge_ghpage.yml @@ -23,7 +23,7 @@ jobs: yarn build --base=/synapse-admin - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.6.0 + uses: JamesIves/github-pages-deploy-action@v4.6.3 with: branch: gh-pages folder: dist diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml index 552ae93..becd1bf 100644 --- a/.github/workflows/github-release.yml +++ b/.github/workflows/github-release.yml @@ -23,7 +23,7 @@ jobs: version=`git describe --dirty --tags || echo unknown` cp -r dist synapse-admin-$version tar chvzf dist/synapse-admin-$version.tar.gz synapse-admin-$version - - uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 + - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 with: files: dist/*.tar.gz env: diff --git a/package.json b/package.json index f1de61e..44df969 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "synapse-admin", - "version": "0.10.1", + "version": "0.10.3", "description": "Admin GUI for the Matrix.org server Synapse", "type": "module", "author": "Awesome Technologies Innovationslabor GmbH", @@ -12,63 +12,64 @@ }, "packageManager": "yarn@4.1.1", "devDependencies": { - "@eslint/js": "^9.1.1", + "@eslint/js": "^9.7.0", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^15.0.2", + "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", - "@types/lodash": "^4.17.0", - "@types/node": "^20.12.7", + "@types/lodash": "^4.17.7", + "@types/node": "^20.14.12", "@types/papaparse": "^5.3.14", - "@types/react": "^18.3.1", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.8.0", + "@types/react": "^18.3.3", + "@typescript-eslint/eslint-plugin": "^7.16.1", + "@typescript-eslint/parser": "^7.16.1", "@vitejs/plugin-react": "^4.0.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-jsx-a11y": "^6.9.0", + "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-unused-imports": "^3.2.0", - "eslint-plugin-yaml": "^0.5.0", + "eslint-plugin-yaml": "^1.0.3", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-fetch-mock": "^3.0.3", - "prettier": "^3.2.5", + "prettier": "^3.3.3", "react-test-renderer": "^18.3.1", - "ts-jest": "^29.1.2", + "ts-jest": "^29.2.3", "ts-node": "^10.9.2", "typescript": "^5.4.5", - "typescript-eslint": "^7.8.0", - "vite": "^5.0.0", - "vite-plugin-version-mark": "^0.0.13" + "typescript-eslint": "^7.16.1", + "vite": "^5.3.4", + "vite-plugin-version-mark": "^0.1.0" }, "dependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", "@haleos/ra-language-german": "^1.0.0", "@haxqer/ra-language-chinese": "^4.16.2", - "@mui/icons-material": "^5.15.16", - "@mui/material": "^5.15.16", - "history": "^5.1.0", + "@mui/icons-material": "^5.16.4", + "@mui/material": "^5.16.4", + "history": "^5.3.0", "lodash": "^4.17.21", "papaparse": "^5.4.1", - "query-string": "^7.1.1", - "ra-core": "^4.16.17", - "ra-i18n-polyglot": "^4.16.17", - "ra-language-english": "^4.16.17", + "query-string": "^7.1.3", + "ra-core": "^4.16.20", + "ra-i18n-polyglot": "^4.16.20", + "ra-language-english": "^4.16.20", "ra-language-farsi": "^4.2.0", - "ra-language-french": "^4.16.17", + "ra-language-french": "^4.16.20", "ra-language-italian": "^3.13.1", + "ra-language-russian": "^4.14.2", "react": "^18.3.1", - "react-admin": "^4.16.17", + "react-admin": "^4.16.20", "react-dom": "^18.3.1", - "react-hook-form": "^7.43.9", + "react-hook-form": "^7.52.1", "react-is": "^18.3.1", - "react-query": "^3.32.1", - "react-router": "^6.23.0", - "react-router-dom": "^6.23.0" + "react-query": "^3.39.3", + "react-router": "^6.25.1", + "react-router-dom": "^6.25.1" }, "scripts": { "start": "vite serve", @@ -94,7 +95,7 @@ "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/stylistic", "plugin:import/typescript", - "plugin:yaml/recommended" + "plugin:yaml/legacy" ], "parser": "@typescript-eslint/parser", "parserOptions": { diff --git a/src/App.tsx b/src/App.tsx index b39ea3d..91bfc12 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,20 +4,21 @@ import polyglotI18nProvider from "ra-i18n-polyglot"; import { Admin, CustomRoutes, Resource, resolveBrowserLocale } from "react-admin"; import { Route } from "react-router-dom"; -import reports from "./components/EventReports"; import { ImportFeature } from "./components/ImportFeature"; -import LoginPage from "./components/LoginPage"; -import registrationToken from "./components/RegistrationTokens"; -import roomDirectory from "./components/RoomDirectory"; -import destinations from "./components/destinations"; -import rooms from "./components/rooms"; -import userMediaStats from "./components/statistics"; -import users from "./components/users"; import germanMessages from "./i18n/de"; import englishMessages from "./i18n/en"; import frenchMessages from "./i18n/fr"; import italianMessages from "./i18n/it"; +import russianMessages from "./i18n/ru"; import chineseMessages from "./i18n/zh"; +import LoginPage from "./pages/LoginPage"; +import destinations from "./resources/destinations"; +import registrationToken from "./resources/registration_tokens"; +import reports from "./resources/reports"; +import roomDirectory from "./resources/room_directory"; +import rooms from "./resources/rooms"; +import userMediaStats from "./resources/user_media_statistics"; +import users from "./resources/users"; import authProvider from "./synapse/authProvider"; import dataProvider from "./synapse/dataProvider"; @@ -27,6 +28,7 @@ const messages = { en: englishMessages, fr: frenchMessages, it: italianMessages, + ru: russianMessages, zh: chineseMessages, }; const i18nProvider = polyglotI18nProvider( @@ -38,6 +40,7 @@ const i18nProvider = polyglotI18nProvider( { locale: "fr", name: "Français" }, { locale: "it", name: "Italiano" }, { locale: "fa", name: "Persian(فارسی)" }, + { locale: "ru", name: "Russian(Русский)" }, { locale: "zh", name: "简体中文" }, ] ); @@ -50,6 +53,7 @@ const App = () => ( authProvider={authProvider} dataProvider={dataProvider} i18nProvider={i18nProvider} + darkTheme={{ palette: { mode: "dark" } }} > } /> diff --git a/src/components/media.tsx b/src/components/media.tsx index 29fc204..772d234 100644 --- a/src/components/media.tsx +++ b/src/components/media.tsx @@ -21,23 +21,27 @@ import { Toolbar, ToolbarProps, useCreate, + useDataProvider, useDelete, useNotify, useRecordContext, useRefresh, useTranslate, } from "react-admin"; +import { useMutation } from "react-query"; import { Link } from "react-router-dom"; import { dateParser } from "./date"; +import { DeleteMediaParams, SynapseDataProvider } from "../synapse/dataProvider"; import { getMediaUrl } from "../synapse/synapse"; +import storage from "../storage"; const DeleteMediaDialog = ({ open, onClose, onSubmit }) => { const translate = useTranslate(); const DeleteMediaToolbar = (props: ToolbarProps) => ( - } /> + } /> @@ -46,21 +50,21 @@ const DeleteMediaDialog = ({ open, onClose, onSubmit }) => { return ( - {translate("resources.delete_media.action.send")} + {translate("delete_media.action.send")} - {translate("resources.delete_media.helper.send")} + {translate("delete_media.helper.send")} } onSubmit={onSubmit}> { @@ -81,34 +85,30 @@ export const DeleteMediaButton = (props: ButtonProps) => { const theme = useTheme(); const [open, setOpen] = useState(false); const notify = useNotify(); - const [deleteOne, { isLoading }] = useDelete(); + const dataProvider = useDataProvider(); + const { mutate: deleteMedia, isLoading } = useMutation( + (values: DeleteMediaParams) => dataProvider.deleteMedia(values), + { + onSuccess: () => { + notify("delete_media.action.send_success"); + closeDialog(); + }, + onError: () => { + notify("delete_media.action.send_failure", { + type: "error", + }); + }, + } + ); const openDialog = () => setOpen(true); const closeDialog = () => setOpen(false); - const deleteMedia = (values: { before_ts: string; size_gt: number; keep_profiles: boolean }) => { - deleteOne( - "delete_media", - // needs meta.before_ts, meta.size_gt and meta.keep_profiles - { meta: values }, - { - onSuccess: () => { - notify("resources.delete_media.action.send_success"); - closeDialog(); - }, - onError: () => - notify("resources.delete_media.action.send_failure", { - type: "error", - }), - } - ); - }; - return ( <>