Compare commits
14 Commits
v0.10.3-et
...
v0.10.3-et
Author | SHA1 | Date | |
---|---|---|---|
![]() |
915e3564f8 | ||
![]() |
1570ca5485 | ||
![]() |
b94b782547 | ||
![]() |
90328a5b19 | ||
![]() |
b42eb07a2f | ||
![]() |
131bfaaece | ||
![]() |
b759d5d5fb | ||
![]() |
003e9da792 | ||
![]() |
908271060b | ||
![]() |
08cd427084 | ||
![]() |
73a1d952b1 | ||
![]() |
1d5511421d | ||
![]() |
b925c63171 | ||
![]() |
6faebaf9df |
22
README.md
22
README.md
@@ -23,6 +23,7 @@ This project is built using [react-admin](https://marmelab.com/react-admin/).
|
|||||||
* [Changes](#changes)
|
* [Changes](#changes)
|
||||||
* [Development](#development)
|
* [Development](#development)
|
||||||
* [Configuration](#configuration)
|
* [Configuration](#configuration)
|
||||||
|
* [Prefilling login form](#prefilling-login-form)
|
||||||
* [Restricting available homeserver](#restricting-available-homeserver)
|
* [Restricting available homeserver](#restricting-available-homeserver)
|
||||||
* [Protecting appservice managed users](#protecting-appservice-managed-users)
|
* [Protecting appservice managed users](#protecting-appservice-managed-users)
|
||||||
* [Adding custom menu items](#adding-custom-menu-items)
|
* [Adding custom menu items](#adding-custom-menu-items)
|
||||||
@@ -91,6 +92,8 @@ with a proper manifest.json generation on build)
|
|||||||
* [Add random password generation on user create/edit form](https://github.com/etkecc/synapse-admin/pull/123)
|
* [Add random password generation on user create/edit form](https://github.com/etkecc/synapse-admin/pull/123)
|
||||||
* [Add option to set user's rate limits](https://github.com/etkecc/synapse-admin/pull/125)
|
* [Add option to set user's rate limits](https://github.com/etkecc/synapse-admin/pull/125)
|
||||||
* [Support configuration via /.well-known/matrix/client](https://github.com/etkecc/synapse-admin/pull/126)
|
* [Support configuration via /.well-known/matrix/client](https://github.com/etkecc/synapse-admin/pull/126)
|
||||||
|
* [Prevent accidental user overwrites](https://github.com/etkecc/synapse-admin/pull/139)
|
||||||
|
* [Allow providing login form details via GET params](https://github.com/etkecc/synapse-admin/pull/140)
|
||||||
|
|
||||||
_the list will be updated as new changes are added_
|
_the list will be updated as new changes are added_
|
||||||
|
|
||||||
@@ -113,6 +116,10 @@ In the latter case, any instance of Synapse Admin will automatically pick up the
|
|||||||
Note that configuration inside the `/.well-known/matrix/client` file should go under the `cc.etke.synapse-admin` key,
|
Note that configuration inside the `/.well-known/matrix/client` file should go under the `cc.etke.synapse-admin` key,
|
||||||
and it will override the configuration from the `config.json` file.
|
and it will override the configuration from the `config.json` file.
|
||||||
|
|
||||||
|
In case you use [spantaleev/matrix-docker-ansible-deploy](https://github.com/spantaleev/matrix-docker-ansible-deploy) or
|
||||||
|
[etkecc/ansible](https://github.com/etkecc/ansible),
|
||||||
|
configuration will be automatically added to the `/.well-known/matrix/client` file.
|
||||||
|
|
||||||
The `config.json` can be injected into a Docker container using a bind mount.
|
The `config.json` can be injected into a Docker container using a bind mount.
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
@@ -124,6 +131,17 @@ services:
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Prefilling login form
|
||||||
|
|
||||||
|
You can prefill `username` and `homeserver` fields on the login page using GET parameters, example:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://matrix.example.com/synapse-admin/?username=admin&server=matrix.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
That way `username` and `homeserver` fields will be pre-filled with `admin` and `https://matrix.example.com` respectively.
|
||||||
|
|
||||||
|
|
||||||
### Restricting available homeserver
|
### Restricting available homeserver
|
||||||
|
|
||||||
You can restrict the homeserver(s), so that the user can no longer define it himself.
|
You can restrict the homeserver(s), so that the user can no longer define it himself.
|
||||||
@@ -132,7 +150,7 @@ Edit `config.json` to restrict either to a single homeserver:
|
|||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"restrictBaseUrl": "https://your-matrixs-erver.example.com"
|
"restrictBaseUrl": "https://matrix.example.com"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -141,7 +159,7 @@ similar for `/.well-known/matrix/client`:
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"cc.etke.synapse-admin": {
|
"cc.etke.synapse-admin": {
|
||||||
"restrictBaseUrl": "https://your-matrixs-erver.example.com"
|
"restrictBaseUrl": "https://matrix.example.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
14
package.json
14
package.json
@@ -22,9 +22,9 @@
|
|||||||
"@types/papaparse": "^5.3.15",
|
"@types/papaparse": "^5.3.15",
|
||||||
"@types/react": "^18.3.12",
|
"@types/react": "^18.3.12",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.11.0",
|
"@typescript-eslint/eslint-plugin": "^8.11.0",
|
||||||
"@typescript-eslint/parser": "^8.11.0",
|
"@typescript-eslint/parser": "^8.13.0",
|
||||||
"@vitejs/plugin-react": "^4.3.3",
|
"@vitejs/plugin-react": "^4.3.3",
|
||||||
"eslint": "^9.13.0",
|
"eslint": "^9.14.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-import": "^2.31.0",
|
"eslint-plugin-import": "^2.31.0",
|
||||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
"ts-jest": "^29.2.5",
|
"ts-jest": "^29.2.5",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"typescript": "^5.6.3",
|
"typescript": "^5.6.3",
|
||||||
"typescript-eslint": "^8.12.2",
|
"typescript-eslint": "^8.13.0",
|
||||||
"vite": "^5.4.10",
|
"vite": "^5.4.10",
|
||||||
"vite-plugin-version-mark": "^0.1.2"
|
"vite-plugin-version-mark": "^0.1.2"
|
||||||
},
|
},
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
"@mui/icons-material": "^6.1.5",
|
"@mui/icons-material": "^6.1.5",
|
||||||
"@mui/material": "^6.1.6",
|
"@mui/material": "^6.1.6",
|
||||||
"@mui/utils": "^5.16.6",
|
"@mui/utils": "^5.16.6",
|
||||||
"@tanstack/react-query": "^5.59.19",
|
"@tanstack/react-query": "^5.59.20",
|
||||||
"history": "^5.3.0",
|
"history": "^5.3.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"papaparse": "^5.4.1",
|
"papaparse": "^5.4.1",
|
||||||
@@ -59,16 +59,16 @@
|
|||||||
"ra-i18n-polyglot": "^5.3.2",
|
"ra-i18n-polyglot": "^5.3.2",
|
||||||
"ra-language-english": "^5.3.2",
|
"ra-language-english": "^5.3.2",
|
||||||
"ra-language-farsi": "^5.0.0",
|
"ra-language-farsi": "^5.0.0",
|
||||||
"ra-language-french": "^5.3.1",
|
"ra-language-french": "^5.3.3",
|
||||||
"ra-language-italian": "^3.13.1",
|
"ra-language-italian": "^3.13.1",
|
||||||
"ra-language-russian": "^4.14.2",
|
"ra-language-russian": "^4.14.2",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-admin": "^5.3.1",
|
"react-admin": "^5.3.3",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-hook-form": "^7.53.1",
|
"react-hook-form": "^7.53.1",
|
||||||
"react-is": "^18.3.1",
|
"react-is": "^18.3.1",
|
||||||
"react-router": "^6.26.2",
|
"react-router": "^6.26.2",
|
||||||
"react-router-dom": "^6.27.0"
|
"react-router-dom": "^6.28.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "vite serve",
|
"start": "vite serve",
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
import { AppBar, TitlePortal, InspectorButton, Confirm, Layout, Logout, Menu, useLogout, UserMenu } from "react-admin";
|
import { CheckForApplicationUpdate, AppBar, TitlePortal, InspectorButton, Confirm, Layout, Logout, Menu, useLogout, UserMenu } from "react-admin";
|
||||||
import { LoginMethod } from "../pages/LoginPage";
|
import { LoginMethod } from "../pages/LoginPage";
|
||||||
import { useEffect, useState, Suspense } from "react";
|
import { useEffect, useState, Suspense } from "react";
|
||||||
import { Icons, DefaultIcon } from "./icons";
|
import { Icons, DefaultIcon } from "./icons";
|
||||||
|
import { ClearConfig } from "./config";
|
||||||
|
|
||||||
const AdminUserMenu = () => {
|
const AdminUserMenu = () => {
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
@@ -21,8 +22,7 @@ const AdminUserMenu = () => {
|
|||||||
|
|
||||||
const handleDialogClose = () => {
|
const handleDialogClose = () => {
|
||||||
setOpen(false);
|
setOpen(false);
|
||||||
localStorage.removeItem("access_token");
|
ClearConfig();
|
||||||
localStorage.removeItem("login_type");
|
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -99,5 +99,6 @@ export const AdminLayout = ({ children }) => (
|
|||||||
},
|
},
|
||||||
}}>
|
}}>
|
||||||
{children}
|
{children}
|
||||||
|
<CheckForApplicationUpdate />
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
|
@@ -4,11 +4,16 @@ import { useDataProvider, useNotify, useRecordContext, useTranslate } from "reac
|
|||||||
import { TextField } from "@mui/material";
|
import { TextField } from "@mui/material";
|
||||||
import { useFormContext } from "react-hook-form";
|
import { useFormContext } from "react-hook-form";
|
||||||
|
|
||||||
const RateLimitRow = ({ limit, value, updateRateLimit }: { limit: string, value: number, updateRateLimit: (limit: string, value: number) => void }) => {
|
const RateLimitRow = ({ limit, value, updateRateLimit }: { limit: string, value: any, updateRateLimit: (limit: string, value: any) => void }) => {
|
||||||
const translate = useTranslate();
|
const translate = useTranslate();
|
||||||
|
|
||||||
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
updateRateLimit(limit, parseInt(event.target.value));
|
const value = parseInt(event.target.value);
|
||||||
|
if (isNaN(value)) {
|
||||||
|
updateRateLimit(limit, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
updateRateLimit(limit, value);
|
||||||
};
|
};
|
||||||
|
|
||||||
return <Stack
|
return <Stack
|
||||||
@@ -48,8 +53,8 @@ export const UserRateLimits = () => {
|
|||||||
const form = useFormContext();
|
const form = useFormContext();
|
||||||
const dataProvider = useDataProvider();
|
const dataProvider = useDataProvider();
|
||||||
const [rateLimits, setRateLimits] = useState({
|
const [rateLimits, setRateLimits] = useState({
|
||||||
messages_per_second: 0,
|
messages_per_second: "", // we are setting string here to make the number field empty by default, null is prohibited by the field validation
|
||||||
burst_count: 0,
|
burst_count: "",
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!record) {
|
if (!record) {
|
||||||
@@ -67,7 +72,7 @@ export const UserRateLimits = () => {
|
|||||||
fetchRateLimits();
|
fetchRateLimits();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const updateRateLimit = async (limit: string, value: number) => {
|
const updateRateLimit = async (limit: string, value: any) => {
|
||||||
let updatedRateLimits = { ...rateLimits, [limit]: value };
|
let updatedRateLimits = { ...rateLimits, [limit]: value };
|
||||||
setRateLimits(updatedRateLimits);
|
setRateLimits(updatedRateLimits);
|
||||||
form.setValue(`rates.${limit}`, value, { shouldDirty: true });
|
form.setValue(`rates.${limit}`, value, { shouldDirty: true });
|
||||||
|
@@ -43,6 +43,13 @@ export const LoadConfig = (context: Config): Config => {
|
|||||||
|
|
||||||
// below we try to calculate "final" config, which will contain values from context and already set values in storage
|
// below we try to calculate "final" config, which will contain values from context and already set values in storage
|
||||||
// because LoadConfig could be called multiple times to get config from different sources
|
// because LoadConfig could be called multiple times to get config from different sources
|
||||||
|
let finalRestrictBaseUrl: string | string[] = "";
|
||||||
|
try {
|
||||||
|
finalRestrictBaseUrl = JSON.parse(storage.getItem("restrict_base_url") || "");
|
||||||
|
if (Array.isArray(finalRestrictBaseUrl) && finalRestrictBaseUrl.length == 1) {
|
||||||
|
finalRestrictBaseUrl = finalRestrictBaseUrl[0];
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
let finalAsManagedUsers: string[] = [];
|
let finalAsManagedUsers: string[] = [];
|
||||||
try {
|
try {
|
||||||
finalAsManagedUsers = JSON.parse(storage.getItem("as_managed_users") || "");
|
finalAsManagedUsers = JSON.parse(storage.getItem("as_managed_users") || "");
|
||||||
@@ -54,10 +61,27 @@ export const LoadConfig = (context: Config): Config => {
|
|||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
restrictBaseUrl: storage.getItem("restrict_base_url") || "",
|
restrictBaseUrl: finalRestrictBaseUrl,
|
||||||
asManagedUsers: finalAsManagedUsers,
|
asManagedUsers: finalAsManagedUsers,
|
||||||
supportURL: storage.getItem("support_url") || "",
|
supportURL: storage.getItem("support_url") || "",
|
||||||
menu: finalMenu,
|
menu: finalMenu,
|
||||||
} as Config;
|
} as Config;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const ClearConfig = () => {
|
||||||
|
// config.json
|
||||||
|
storage.removeItem("restrict_base_url");
|
||||||
|
storage.removeItem("as_managed_users");
|
||||||
|
storage.removeItem("support_url");
|
||||||
|
storage.removeItem("menu");
|
||||||
|
|
||||||
|
// session
|
||||||
|
storage.removeItem("home_server");
|
||||||
|
storage.removeItem("base_url");
|
||||||
|
storage.removeItem("user_id");
|
||||||
|
storage.removeItem("device_id");
|
||||||
|
storage.removeItem("access_token");
|
||||||
|
storage.removeItem("login_type");
|
||||||
|
}
|
||||||
|
@@ -184,6 +184,7 @@ const de: SynapseTranslationMessages = {
|
|||||||
erase_text: "Das bedeutet, dass die von dem/den Benutzer(n) gesendeten Nachrichten für alle, die zum Zeitpunkt des Sendens im Raum waren, sichtbar bleiben, aber für Benutzer, die dem Raum später beitreten, nicht sichtbar sind.",
|
erase_text: "Das bedeutet, dass die von dem/den Benutzer(n) gesendeten Nachrichten für alle, die zum Zeitpunkt des Sendens im Raum waren, sichtbar bleiben, aber für Benutzer, die dem Raum später beitreten, nicht sichtbar sind.",
|
||||||
erase_admin_error: "Das Löschen des eigenen Benutzers ist nicht erlaubt.",
|
erase_admin_error: "Das Löschen des eigenen Benutzers ist nicht erlaubt.",
|
||||||
modify_managed_user_error: "Das Ändern eines vom System verwalteten Benutzers ist nicht zulässig.",
|
modify_managed_user_error: "Das Ändern eines vom System verwalteten Benutzers ist nicht zulässig.",
|
||||||
|
username_available: "Benutzername verfügbar",
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
erase: "Lösche Benutzerdaten",
|
erase: "Lösche Benutzerdaten",
|
||||||
@@ -191,10 +192,14 @@ const de: SynapseTranslationMessages = {
|
|||||||
delete_media: "Alle von dem/den Benutzer(n) hochgeladenen Medien löschen",
|
delete_media: "Alle von dem/den Benutzer(n) hochgeladenen Medien löschen",
|
||||||
redact_events: "Schwärzen aller vom Benutzer gesendeten Ereignisse (-s)",
|
redact_events: "Schwärzen aller vom Benutzer gesendeten Ereignisse (-s)",
|
||||||
generate_password: "Passwort generieren",
|
generate_password: "Passwort generieren",
|
||||||
|
overwrite_title: "Warnung!",
|
||||||
|
overwrite_content: "Dieser Benutzername ist bereits vergeben. Sind Sie sicher, dass Sie den vorhandenen Benutzer überschreiben möchten?",
|
||||||
|
overwrite_cancel: "Abbrechen",
|
||||||
|
overwrite_confirm: "Überschreiben",
|
||||||
},
|
},
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: "Nachrichten pro Sekunde",
|
messages_per_second: "Nachrichten pro Sekunde",
|
||||||
messages_per_second_text: "Die Anzahl der Aktionen, die in einer Sekunde durchgeführt werden können. 0 bedeutet, dass die Rate-Limitierung für diesen Benutzer deaktiviert ist.",
|
messages_per_second_text: "Die Anzahl der Aktionen, die in einer Sekunde durchgeführt werden können.",
|
||||||
burst_count: "Burst-Anzahl",
|
burst_count: "Burst-Anzahl",
|
||||||
burst_count_text: "Die Anzahl der Aktionen, die vor der Begrenzung durchgeführt werden können.",
|
burst_count_text: "Die Anzahl der Aktionen, die vor der Begrenzung durchgeführt werden können.",
|
||||||
}
|
}
|
||||||
|
@@ -157,6 +157,7 @@ const en: SynapseTranslationMessages = {
|
|||||||
erase_text: "This means messages sent by the user(-s) will still be visible by anyone who was in the room when these messages were sent, but hidden from users joining the room afterward.",
|
erase_text: "This means messages sent by the user(-s) will still be visible by anyone who was in the room when these messages were sent, but hidden from users joining the room afterward.",
|
||||||
erase_admin_error: "Deleting own user is not allowed.",
|
erase_admin_error: "Deleting own user is not allowed.",
|
||||||
modify_managed_user_error: "Modifying a system-managed user is not allowed.",
|
modify_managed_user_error: "Modifying a system-managed user is not allowed.",
|
||||||
|
username_available: "Username is available",
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
erase: "Erase user data",
|
erase: "Erase user data",
|
||||||
@@ -164,10 +165,14 @@ const en: SynapseTranslationMessages = {
|
|||||||
delete_media: "Delete all media uploaded by the user(-s)",
|
delete_media: "Delete all media uploaded by the user(-s)",
|
||||||
redact_events: "Redact all events sent by the user(-s)",
|
redact_events: "Redact all events sent by the user(-s)",
|
||||||
generate_password: "Generate password",
|
generate_password: "Generate password",
|
||||||
|
overwrite_title: "Warning!",
|
||||||
|
overwrite_content: "This username is already taken. Are you sure that you want to overwrite the existing user?",
|
||||||
|
overwrite_cancel: "Cancel",
|
||||||
|
overwrite_confirm: "Overwrite",
|
||||||
},
|
},
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: "Messages per second",
|
messages_per_second: "Messages per second",
|
||||||
messages_per_second_text: "The number of actions that can be performed in a second. 0 mean that ratelimiting is disabled for this user",
|
messages_per_second_text: "The number of actions that can be performed in a second.",
|
||||||
burst_count: "Burst count",
|
burst_count: "Burst count",
|
||||||
burst_count_text: "How many actions that can be performed before being limited.",
|
burst_count_text: "How many actions that can be performed before being limited.",
|
||||||
}
|
}
|
||||||
|
@@ -149,6 +149,7 @@ const fa: SynapseTranslationMessages = {
|
|||||||
erase_text: "وهذا يعني أن الرسائل المرسلة من قبل المستخدم (المستخدمين) ستظل مرئية من قبل أي شخص كان في الغرفة عند إرسال هذه الرسائل، ولكنها مخفية عن المستخدمين الذين ينضمون إلى الغرفة بعد ذلك.",
|
erase_text: "وهذا يعني أن الرسائل المرسلة من قبل المستخدم (المستخدمين) ستظل مرئية من قبل أي شخص كان في الغرفة عند إرسال هذه الرسائل، ولكنها مخفية عن المستخدمين الذين ينضمون إلى الغرفة بعد ذلك.",
|
||||||
erase_admin_error: "حذف المستخدم الخاص غير مسموح به.",
|
erase_admin_error: "حذف المستخدم الخاص غير مسموح به.",
|
||||||
modify_managed_user_error: "لا يُسمح بتغيير المستخدم الذي يديره النظام.",
|
modify_managed_user_error: "لا يُسمح بتغيير المستخدم الذي يديره النظام.",
|
||||||
|
username_available: "نام کاربری موجود",
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
erase: "پاک کردن اطلاعات کاربر",
|
erase: "پاک کردن اطلاعات کاربر",
|
||||||
@@ -156,10 +157,14 @@ const fa: SynapseTranslationMessages = {
|
|||||||
delete_media: "حذف جميع الوسائط التي تم تحميلها بواسطة المستخدم (المستخدمين)",
|
delete_media: "حذف جميع الوسائط التي تم تحميلها بواسطة المستخدم (المستخدمين)",
|
||||||
redact_events: "تنقيح جميع الأحداث المرسلة من قبل المستخدم (-s)",
|
redact_events: "تنقيح جميع الأحداث المرسلة من قبل المستخدم (-s)",
|
||||||
generate_password: "توليد رمز عبور",
|
generate_password: "توليد رمز عبور",
|
||||||
|
overwrite_title: "هشدار!",
|
||||||
|
overwrite_content: "این نام کاربری قبلا استفاده شده است. آیا مطمئن هستید که می خواهید کاربر موجود را بازنویسی کنید؟",
|
||||||
|
overwrite_cancel: "انصراف",
|
||||||
|
overwrite_confirm: "بازنویسی",
|
||||||
},
|
},
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: "پیام در ثانیه",
|
messages_per_second: "پیام در ثانیه",
|
||||||
messages_per_second_text: "تعداد عملیاتی که می تواند در یک ثانیه انجام شود. 0 به معنای غیرفعال کردن محدودیت برای این کاربر است.",
|
messages_per_second_text: "تعداد عملیاتی که می تواند در یک ثانیه انجام شود.",
|
||||||
burst_count: "تعداد پیچیدگی",
|
burst_count: "تعداد پیچیدگی",
|
||||||
burst_count_text: "تعداد عملیاتی که می تواند قبل از محدودیت انجام شود.",
|
burst_count_text: "تعداد عملیاتی که می تواند قبل از محدودیت انجام شود.",
|
||||||
}
|
}
|
||||||
|
@@ -151,6 +151,7 @@ const fr: SynapseTranslationMessages = {
|
|||||||
erase_text: "Cela signifie que les messages envoyés par le(s) utilisateur(s) seront toujours visibles par toute personne qui se trouvait dans la salle au moment où ces messages ont été envoyés, mais qu'ils seront cachés aux utilisateurs qui rejoindront la salle par la suite.",
|
erase_text: "Cela signifie que les messages envoyés par le(s) utilisateur(s) seront toujours visibles par toute personne qui se trouvait dans la salle au moment où ces messages ont été envoyés, mais qu'ils seront cachés aux utilisateurs qui rejoindront la salle par la suite.",
|
||||||
erase_admin_error: "La suppression de son propre utilisateur n'est pas autorisée.",
|
erase_admin_error: "La suppression de son propre utilisateur n'est pas autorisée.",
|
||||||
modify_managed_user_error: "La modification d'un utilisateur géré par le système n'est pas autorisée.",
|
modify_managed_user_error: "La modification d'un utilisateur géré par le système n'est pas autorisée.",
|
||||||
|
username_available: "Nom d'utilisateur disponible",
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
erase: "Effacer les données de l'utilisateur",
|
erase: "Effacer les données de l'utilisateur",
|
||||||
@@ -158,10 +159,14 @@ const fr: SynapseTranslationMessages = {
|
|||||||
delete_media: "Supprimer tous les médias téléchargés par le(s) utilisateur(s)",
|
delete_media: "Supprimer tous les médias téléchargés par le(s) utilisateur(s)",
|
||||||
redact_events: "Expurger tous les événements envoyés par l'utilisateur(-s)",
|
redact_events: "Expurger tous les événements envoyés par l'utilisateur(-s)",
|
||||||
generate_password: "Générer un mot de passe",
|
generate_password: "Générer un mot de passe",
|
||||||
|
overwrite_title: "Attention !",
|
||||||
|
overwrite_content: "Ce nom d'utilisateur est déjà pris. Êtes-vous sûr de vouloir écraser l'utilisateur existant ?",
|
||||||
|
overwrite_cancel: "Annuler",
|
||||||
|
overwrite_confirm: "Écraser",
|
||||||
},
|
},
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: "Messages par seconde",
|
messages_per_second: "Messages par seconde",
|
||||||
messages_per_second_text: "Le nombre d'actions que l'utilisateur peut effectuer par seconde. 0 signifie que la limitation est désactivée pour cet utilisateur.",
|
messages_per_second_text: "Le nombre d'actions que l'utilisateur peut effectuer par seconde.",
|
||||||
burst_count: "Compteur de pics",
|
burst_count: "Compteur de pics",
|
||||||
burst_count_text: "Le nombre d'actions que l'utilisateur peut effectuer avant d'être limité.",
|
burst_count_text: "Le nombre d'actions que l'utilisateur peut effectuer avant d'être limité.",
|
||||||
}
|
}
|
||||||
|
5
src/i18n/index.d.ts
vendored
5
src/i18n/index.d.ts
vendored
@@ -149,6 +149,7 @@ interface SynapseTranslationMessages extends TranslationMessages {
|
|||||||
erase_text: string;
|
erase_text: string;
|
||||||
erase_admin_error: string;
|
erase_admin_error: string;
|
||||||
modify_managed_user_error: string;
|
modify_managed_user_error: string;
|
||||||
|
username_available: string;
|
||||||
};
|
};
|
||||||
action: {
|
action: {
|
||||||
erase: string;
|
erase: string;
|
||||||
@@ -156,6 +157,10 @@ interface SynapseTranslationMessages extends TranslationMessages {
|
|||||||
delete_media: string;
|
delete_media: string;
|
||||||
redact_events: string;
|
redact_events: string;
|
||||||
generate_password: string;
|
generate_password: string;
|
||||||
|
overwrite_title: string;
|
||||||
|
overwrite_content: string;
|
||||||
|
overwrite_cancel: string;
|
||||||
|
overwrite_confirm: string;
|
||||||
};
|
};
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: string;
|
messages_per_second: string;
|
||||||
|
@@ -150,6 +150,7 @@ const it: SynapseTranslationMessages = {
|
|||||||
erase_text: "Ciò significa che i messaggi inviati dall'utente (o dagli utenti) saranno ancora visibili da chiunque si trovasse nella stanza al momento dell'invio, ma saranno nascosti agli utenti che si uniranno alla stanza in seguito.",
|
erase_text: "Ciò significa che i messaggi inviati dall'utente (o dagli utenti) saranno ancora visibili da chiunque si trovasse nella stanza al momento dell'invio, ma saranno nascosti agli utenti che si uniranno alla stanza in seguito.",
|
||||||
erase_admin_error: "Non è consentito eliminare il proprio utente.",
|
erase_admin_error: "Non è consentito eliminare il proprio utente.",
|
||||||
modify_managed_user_error: "La modifica di un utente gestito dal sistema non è consentita.",
|
modify_managed_user_error: "La modifica di un utente gestito dal sistema non è consentita.",
|
||||||
|
username_available: "Nome utente disponibile",
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
erase: "Cancella i dati dell'utente",
|
erase: "Cancella i dati dell'utente",
|
||||||
@@ -157,10 +158,14 @@ const it: SynapseTranslationMessages = {
|
|||||||
delete_media: "Elimina tutti i media caricati dall'utente(-s)",
|
delete_media: "Elimina tutti i media caricati dall'utente(-s)",
|
||||||
redact_events: "Ridurre tutti gli eventi inviati dall'utente(-s)",
|
redact_events: "Ridurre tutti gli eventi inviati dall'utente(-s)",
|
||||||
generate_password: "Genera password",
|
generate_password: "Genera password",
|
||||||
|
overwrite_title: "Attenzione!",
|
||||||
|
overwrite_content: "Questo nome utente è già stato utilizzato. Sei sicuro di voler sovrascrivere l'utente esistente?",
|
||||||
|
overwrite_cancel: "Annulla",
|
||||||
|
overwrite_confirm: "Sovrascrivi",
|
||||||
},
|
},
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: "Messaggi al secondo",
|
messages_per_second: "Messaggi al secondo",
|
||||||
messages_per_second_text: "Il numero di azioni che l'utente può eseguire al secondo. 0 significa che la limitazione è disabilitata per questo utente.",
|
messages_per_second_text: "Il numero di azioni che l'utente può eseguire al secondo.",
|
||||||
burst_count: "Burst-conteggio",
|
burst_count: "Burst-conteggio",
|
||||||
burst_count_text: "Il numero di azioni che l'utente può eseguire prima di essere limitato.",
|
burst_count_text: "Il numero di azioni che l'utente può eseguire prima di essere limitato.",
|
||||||
}
|
}
|
||||||
|
@@ -187,6 +187,7 @@ const ru: SynapseTranslationMessages = {
|
|||||||
erase_text: "Это означает, что сообщения, отправленные пользователем (-ами), будут по-прежнему видны всем, кто находился в комнате в момент их отправки, но будут скрыты от пользователей, присоединившихся к комнате после этого.",
|
erase_text: "Это означает, что сообщения, отправленные пользователем (-ами), будут по-прежнему видны всем, кто находился в комнате в момент их отправки, но будут скрыты от пользователей, присоединившихся к комнате после этого.",
|
||||||
erase_admin_error: "Удаление собственного пользователя запрещено.",
|
erase_admin_error: "Удаление собственного пользователя запрещено.",
|
||||||
modify_managed_user_error: "Изменение пользователя, управляемого системой, не допускается.",
|
modify_managed_user_error: "Изменение пользователя, управляемого системой, не допускается.",
|
||||||
|
username_available: "Имя пользователя доступно",
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
erase: "Удалить данные пользователя",
|
erase: "Удалить данные пользователя",
|
||||||
@@ -194,10 +195,14 @@ const ru: SynapseTranslationMessages = {
|
|||||||
delete_media: "Удаление всех медиафайлов, загруженных пользователем (-ами)",
|
delete_media: "Удаление всех медиафайлов, загруженных пользователем (-ами)",
|
||||||
redact_events: "Удаление всех событий, отправленных пользователем (-ами)",
|
redact_events: "Удаление всех событий, отправленных пользователем (-ами)",
|
||||||
generate_password: "Сгенерировать пароль",
|
generate_password: "Сгенерировать пароль",
|
||||||
|
overwrite_title: "Предупреждение!",
|
||||||
|
overwrite_content: "Это имя пользователя уже занято. Вы уверены, что хотите перезаписать существующего пользователя?",
|
||||||
|
overwrite_cancel: "Отмена",
|
||||||
|
overwrite_confirm: "Перезаписать",
|
||||||
},
|
},
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: "Сообщений в секунду",
|
messages_per_second: "Сообщений в секунду",
|
||||||
messages_per_second_text: "Количество действий, которые могут быть выполнены в секунду. 0 означает, что ограничение на количество действий отключено для этого пользователя.",
|
messages_per_second_text: "Количество действий, которые могут быть выполнены в секунду.",
|
||||||
burst_count: "Burst-счётчик",
|
burst_count: "Burst-счётчик",
|
||||||
burst_count_text: "Количество действий, которые могут быть выполнены до ограничения.",
|
burst_count_text: "Количество действий, которые могут быть выполнены до ограничения.",
|
||||||
}
|
}
|
||||||
|
@@ -174,6 +174,7 @@ const zh: SynapseTranslationMessages = {
|
|||||||
erase_text: "这意味着用户发送的信息对于发送信息时在房间内的任何人来说都是可见的,但对于之后加入房间的用户来说则是隐藏的。",
|
erase_text: "这意味着用户发送的信息对于发送信息时在房间内的任何人来说都是可见的,但对于之后加入房间的用户来说则是隐藏的。",
|
||||||
erase_admin_error: "不允许删除自己的用户",
|
erase_admin_error: "不允许删除自己的用户",
|
||||||
modify_managed_user_error: "不允许修改系统管理的用户。",
|
modify_managed_user_error: "不允许修改系统管理的用户。",
|
||||||
|
username_available: "用户名可用",
|
||||||
},
|
},
|
||||||
action: {
|
action: {
|
||||||
erase: "抹除用户信息",
|
erase: "抹除用户信息",
|
||||||
@@ -181,10 +182,14 @@ const zh: SynapseTranslationMessages = {
|
|||||||
delete_media: "删除用户上传的所有媒体",
|
delete_media: "删除用户上传的所有媒体",
|
||||||
redact_events: "重新编辑用户(-s)发送的所有事件",
|
redact_events: "重新编辑用户(-s)发送的所有事件",
|
||||||
generate_password: "生成密码",
|
generate_password: "生成密码",
|
||||||
|
overwrite_title: "警告!",
|
||||||
|
overwrite_content: "这个用户名已经被占用。您确定要覆盖现有的用户吗?",
|
||||||
|
overwrite_cancel: "取消",
|
||||||
|
overwrite_confirm: "覆盖",
|
||||||
},
|
},
|
||||||
limits: {
|
limits: {
|
||||||
messages_per_second: "每秒消息数",
|
messages_per_second: "每秒消息数",
|
||||||
messages_per_second_text: "每秒可以执行的操作数。0 表示禁用此用户的限制。",
|
messages_per_second_text: "每秒可以执行的操作数。",
|
||||||
burst_count: "Burst-计数",
|
burst_count: "Burst-计数",
|
||||||
burst_count_text: "在限制之前可以执行的操作数。",
|
burst_count_text: "在限制之前可以执行的操作数。",
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,12 @@ import { AppContext } from "./AppContext";
|
|||||||
import storage from "./storage";
|
import storage from "./storage";
|
||||||
|
|
||||||
// load config.json
|
// load config.json
|
||||||
let props: Config = {};
|
let props: Config = {
|
||||||
|
restrictBaseUrl: [],
|
||||||
|
asManagedUsers: [],
|
||||||
|
supportURL: "",
|
||||||
|
menu: [],
|
||||||
|
};
|
||||||
try {
|
try {
|
||||||
const resp = await fetch("config.json");
|
const resp = await fetch("config.json");
|
||||||
const configJSON = await resp.json();
|
const configJSON = await resp.json();
|
||||||
|
@@ -96,6 +96,9 @@ const LoginPage = () => {
|
|||||||
|
|
||||||
const handleSubmit = auth => {
|
const handleSubmit = auth => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
const cleanUrl = window.location.href.replace(window.location.search, "");
|
||||||
|
window.history.replaceState({}, "", cleanUrl);
|
||||||
|
|
||||||
login(auth).catch(error => {
|
login(auth).catch(error => {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
notify(
|
notify(
|
||||||
@@ -166,6 +169,22 @@ const LoginPage = () => {
|
|||||||
.catch(() => setSSOBaseUrl(""));
|
.catch(() => setSSOBaseUrl(""));
|
||||||
}, [formData.base_url, form]);
|
}, [formData.base_url, form]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
const username = params.get("username");
|
||||||
|
let serverURL = params.get("server");
|
||||||
|
if (username) {
|
||||||
|
form.setValue("username", username);
|
||||||
|
}
|
||||||
|
if (serverURL) {
|
||||||
|
const isFullUrl = serverURL.match(/^(http|https):\/\//);
|
||||||
|
if (!isFullUrl) {
|
||||||
|
serverURL = `https://${serverURL}`;
|
||||||
|
}
|
||||||
|
form.setValue("base_url", serverURL);
|
||||||
|
}
|
||||||
|
}, [window.location.search]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Tabs
|
<Tabs
|
||||||
@@ -186,10 +205,10 @@ const LoginPage = () => {
|
|||||||
source="username"
|
source="username"
|
||||||
label="ra.auth.username"
|
label="ra.auth.username"
|
||||||
autoComplete="username"
|
autoComplete="username"
|
||||||
disabled={loading || !supportPassAuth}
|
|
||||||
onBlur={handleUsernameChange}
|
onBlur={handleUsernameChange}
|
||||||
resettable
|
resettable
|
||||||
validate={required()}
|
validate={required()}
|
||||||
|
{...(loading || !supportPassAuth ? { disabled: true } : {})}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
<Box>
|
<Box>
|
||||||
@@ -198,7 +217,7 @@ const LoginPage = () => {
|
|||||||
label="ra.auth.password"
|
label="ra.auth.password"
|
||||||
type="password"
|
type="password"
|
||||||
autoComplete="current-password"
|
autoComplete="current-password"
|
||||||
disabled={loading || !supportPassAuth}
|
{...(loading || !supportPassAuth ? { disabled: true } : {})}
|
||||||
resettable
|
resettable
|
||||||
validate={required()}
|
validate={required()}
|
||||||
/>
|
/>
|
||||||
@@ -209,7 +228,7 @@ const LoginPage = () => {
|
|||||||
<TextInput
|
<TextInput
|
||||||
source="accessToken"
|
source="accessToken"
|
||||||
label="synapseadmin.auth.access_token"
|
label="synapseadmin.auth.access_token"
|
||||||
disabled={loading}
|
{...(loading ? { disabled: true } : {})}
|
||||||
resettable
|
resettable
|
||||||
validate={required()}
|
validate={required()}
|
||||||
/>
|
/>
|
||||||
@@ -221,7 +240,7 @@ const LoginPage = () => {
|
|||||||
label="synapseadmin.auth.base_url"
|
label="synapseadmin.auth.base_url"
|
||||||
select={allowMultipleBaseUrls}
|
select={allowMultipleBaseUrls}
|
||||||
autoComplete="url"
|
autoComplete="url"
|
||||||
disabled={loading}
|
{...(loading ? { disabled: true } : {})}
|
||||||
readOnly={allowSingleBaseUrl}
|
readOnly={allowSingleBaseUrl}
|
||||||
resettable={allowAnyBaseUrl}
|
resettable={allowAnyBaseUrl}
|
||||||
validate={[required(), validateBaseUrl]}
|
validate={[required(), validateBaseUrl]}
|
||||||
|
@@ -11,7 +11,8 @@ import ScienceIcon from "@mui/icons-material/Science";
|
|||||||
import LockClockIcon from '@mui/icons-material/LockClock';
|
import LockClockIcon from '@mui/icons-material/LockClock';
|
||||||
import ViewListIcon from "@mui/icons-material/ViewList";
|
import ViewListIcon from "@mui/icons-material/ViewList";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { Alert } from "@mui/material";
|
import { Alert, Typography } from "@mui/material";
|
||||||
|
import { useTheme } from "@mui/material/styles";
|
||||||
import {
|
import {
|
||||||
ArrayInput,
|
ArrayInput,
|
||||||
ArrayField,
|
ArrayField,
|
||||||
@@ -60,6 +61,9 @@ import {
|
|||||||
ImageField,
|
ImageField,
|
||||||
FunctionField,
|
FunctionField,
|
||||||
useDataProvider,
|
useDataProvider,
|
||||||
|
Confirm,
|
||||||
|
useCreate,
|
||||||
|
useRedirect,
|
||||||
} from "react-admin";
|
} from "react-admin";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
@@ -74,6 +78,7 @@ import { generateRandomPassword } from "../synapse/synapse";
|
|||||||
import { useFormContext } from "react-hook-form";
|
import { useFormContext } from "react-hook-form";
|
||||||
import { ExperimentalFeaturesList } from "../components/ExperimentalFeatures";
|
import { ExperimentalFeaturesList } from "../components/ExperimentalFeatures";
|
||||||
import { UserRateLimits } from "../components/UserRateLimits";
|
import { UserRateLimits } from "../components/UserRateLimits";
|
||||||
|
import { User, UsernameAvailabilityResult } from "../synapse/dataProvider";
|
||||||
|
|
||||||
const choices_medium = [
|
const choices_medium = [
|
||||||
{ id: "email", name: "resources.users.email" },
|
{ id: "email", name: "resources.users.email" },
|
||||||
@@ -213,13 +218,70 @@ const UserEditActions = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const UserCreate = (props: CreateProps) => (
|
export const UserCreate = (props: CreateProps) => {
|
||||||
<Create
|
const dataProvider = useDataProvider();
|
||||||
|
const translate = useTranslate();
|
||||||
|
const redirect = useRedirect();
|
||||||
|
const notify = useNotify();
|
||||||
|
const theme = useTheme();
|
||||||
|
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const [userIsAvailable, setUserIsAvailable] = useState<boolean | undefined>();
|
||||||
|
const [userAvailabilityEl, setUserAvailabilityEl] = useState<React.ReactElement | false>(<Typography component="span"></Typography>);
|
||||||
|
const [formData, setFormData] = useState<Record<string, any>>({});
|
||||||
|
const [create] = useCreate();
|
||||||
|
|
||||||
|
const checkAvailability = async(event: React.FocusEvent<HTMLInputElement>) => {
|
||||||
|
const username = event.target.value;
|
||||||
|
const result: UsernameAvailabilityResult = await dataProvider.checkUsernameAvailability(username);
|
||||||
|
setUserIsAvailable(!!result?.available);
|
||||||
|
if (result?.available) {
|
||||||
|
setUserAvailabilityEl(<Typography component="span" variant="body2" sx={{ color: theme.palette.success.main }}>✔️ {translate("resources.users.helper.username_available")}</Typography>);
|
||||||
|
} else {
|
||||||
|
setUserAvailabilityEl(<Typography component="span" variant="body2" sx={{ color: theme.palette.warning.main }}>⚠️ {result?.error || "unknown error"}</Typography>);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const postSave = (data: Record<string, any>) => {
|
||||||
|
setFormData(data);
|
||||||
|
if (!userIsAvailable) {
|
||||||
|
setOpen(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
create("users", { data: data }, {
|
||||||
|
onSuccess: (resource: User) => {
|
||||||
|
notify("ra.notification.created", { messageArgs: { smart_count: 1 } });
|
||||||
|
redirect(() => { return `users/${resource.id}` });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleConfirm = () => {
|
||||||
|
setOpen(false);
|
||||||
|
updateUser();
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleDialogClose = () => {
|
||||||
|
setOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateUser = () => {
|
||||||
|
create("users", { data: formData }, {
|
||||||
|
onSuccess: (resource: User) => {
|
||||||
|
notify("ra.notification.updated", { messageArgs: { smart_count: 1 } });
|
||||||
|
redirect(() => { return `users/${resource.id}` });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Create
|
||||||
{...props}
|
{...props}
|
||||||
redirect={(resource: string | undefined, id: Identifier | undefined) => `${resource}/${id}`}
|
|
||||||
>
|
>
|
||||||
<SimpleForm>
|
<SimpleForm
|
||||||
<TextInput source="id" autoComplete="off" validate={validateUser} />
|
onSubmit={postSave}
|
||||||
|
>
|
||||||
|
<TextInput source="id" autoComplete="off" validate={validateUser} onBlur={checkAvailability} helperText={userAvailabilityEl}/>
|
||||||
<TextInput source="displayname" validate={maxLength(256)} />
|
<TextInput source="displayname" validate={maxLength(256)} />
|
||||||
<PasswordInput source="password" autoComplete="new-password" validate={maxLength(512)} />
|
<PasswordInput source="password" autoComplete="new-password" validate={maxLength(512)} />
|
||||||
<SelectInput source="user_type" choices={choices_type} translateChoice={false} resettable />
|
<SelectInput source="user_type" choices={choices_type} translateChoice={false} resettable />
|
||||||
@@ -237,8 +299,17 @@ export const UserCreate = (props: CreateProps) => (
|
|||||||
</SimpleFormIterator>
|
</SimpleFormIterator>
|
||||||
</ArrayInput>
|
</ArrayInput>
|
||||||
</SimpleForm>
|
</SimpleForm>
|
||||||
|
<Confirm
|
||||||
|
isOpen={open}
|
||||||
|
title="resources.users.action.overwrite_title"
|
||||||
|
content="resources.users.action.overwrite_content"
|
||||||
|
onConfirm={handleConfirm}
|
||||||
|
onClose={handleDialogClose}
|
||||||
|
confirm="resources.users.action.overwrite_confirm"
|
||||||
|
cancel="resources.users.action.overwrite_cancel"
|
||||||
|
/>
|
||||||
</Create>
|
</Create>
|
||||||
);
|
};
|
||||||
|
|
||||||
const UserTitle = () => {
|
const UserTitle = () => {
|
||||||
const record = useRecordContext();
|
const record = useRecordContext();
|
||||||
|
@@ -3,6 +3,7 @@ import { AuthProvider, HttpError, Options, fetchUtils } from "react-admin";
|
|||||||
import storage from "../storage";
|
import storage from "../storage";
|
||||||
import { MatrixError, displayError } from "../components/error";
|
import { MatrixError, displayError } from "../components/error";
|
||||||
import { fetchAuthenticatedMedia } from "../utils/fetchMedia";
|
import { fetchAuthenticatedMedia } from "../utils/fetchMedia";
|
||||||
|
import { ClearConfig } from "../components/config";
|
||||||
|
|
||||||
const authProvider: AuthProvider = {
|
const authProvider: AuthProvider = {
|
||||||
// called when the user attempts to log in
|
// called when the user attempts to log in
|
||||||
@@ -154,8 +155,7 @@ const authProvider: AuthProvider = {
|
|||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log("Error logging out", err);
|
console.log("Error logging out", err);
|
||||||
} finally {
|
} finally {
|
||||||
storage.removeItem("access_token");
|
ClearConfig();
|
||||||
storage.removeItem("login_type");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -120,7 +120,8 @@ interface ExternalId {
|
|||||||
external_id: string;
|
external_id: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface User {
|
export interface User {
|
||||||
|
id?: string;
|
||||||
name: string;
|
name: string;
|
||||||
displayname?: string;
|
displayname?: string;
|
||||||
threepids: Threepid[];
|
threepids: Threepid[];
|
||||||
@@ -259,12 +260,19 @@ export interface RateLimitsModel {
|
|||||||
burst_count?: number;
|
burst_count?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface UsernameAvailabilityResult {
|
||||||
|
available?: boolean;
|
||||||
|
error?: string;
|
||||||
|
errcode?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface SynapseDataProvider extends DataProvider {
|
export interface SynapseDataProvider extends DataProvider {
|
||||||
deleteMedia: (params: DeleteMediaParams) => Promise<DeleteMediaResult>;
|
deleteMedia: (params: DeleteMediaParams) => Promise<DeleteMediaResult>;
|
||||||
uploadMedia: (params: UploadMediaParams) => Promise<UploadMediaResult>;
|
uploadMedia: (params: UploadMediaParams) => Promise<UploadMediaResult>;
|
||||||
updateFeatures: (id: Identifier, features: ExperimentalFeaturesModel) => Promise<void>;
|
updateFeatures: (id: Identifier, features: ExperimentalFeaturesModel) => Promise<void>;
|
||||||
getRateLimits: (id: Identifier) => Promise<RateLimitsModel>;
|
getRateLimits: (id: Identifier) => Promise<RateLimitsModel>;
|
||||||
setRateLimits: (id: Identifier, rateLimits: RateLimitsModel) => Promise<void>;
|
setRateLimits: (id: Identifier, rateLimits: RateLimitsModel) => Promise<void>;
|
||||||
|
checkUsernameAvailability: (username: string) => Promise<UsernameAvailabilityResult>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const resourceMap = {
|
const resourceMap = {
|
||||||
@@ -830,10 +838,35 @@ const baseDataProvider: SynapseDataProvider = {
|
|||||||
return json as RateLimitsModel;
|
return json as RateLimitsModel;
|
||||||
},
|
},
|
||||||
setRateLimits: async (id: Identifier, rateLimits: RateLimitsModel) => {
|
setRateLimits: async (id: Identifier, rateLimits: RateLimitsModel) => {
|
||||||
|
const filtered = Object.entries(rateLimits).
|
||||||
|
filter(([key, value]) => value !== null && value !== undefined).
|
||||||
|
reduce((obj, [key, value]) => {
|
||||||
|
obj[key] = value;
|
||||||
|
return obj;
|
||||||
|
}, {});
|
||||||
|
|
||||||
const base_url = storage.getItem("base_url");
|
const base_url = storage.getItem("base_url");
|
||||||
const endpoint_url = `${base_url}/_synapse/admin/v1/users/${encodeURIComponent(returnMXID(id))}/override_ratelimit`;
|
const endpoint_url = `${base_url}/_synapse/admin/v1/users/${encodeURIComponent(returnMXID(id))}/override_ratelimit`;
|
||||||
await jsonClient(endpoint_url, { method: "POST", body: JSON.stringify(rateLimits) });
|
if (Object.keys(filtered).length === 0) {
|
||||||
|
await jsonClient(endpoint_url, { method: "DELETE" });
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await jsonClient(endpoint_url, { method: "POST", body: JSON.stringify(filtered) });
|
||||||
},
|
},
|
||||||
|
checkUsernameAvailability: async (username: string) => {
|
||||||
|
const base_url = storage.getItem("base_url");
|
||||||
|
const endpoint_url = `${base_url}/_synapse/admin/v1/username_available?username=${encodeURIComponent(username)}`;
|
||||||
|
try {
|
||||||
|
const { json } = await jsonClient(endpoint_url);
|
||||||
|
return json as UsernameAvailabilityResult;
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof HttpError) {
|
||||||
|
return { available: false, error: error.body.error, errcode: error.body.errcode } as UsernameAvailabilityResult;
|
||||||
|
}
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const dataProvider = withLifecycleCallbacks(baseDataProvider, [
|
const dataProvider = withLifecycleCallbacks(baseDataProvider, [
|
||||||
|
323
yarn.lock
323
yarn.lock
@@ -658,10 +658,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
eslint-visitor-keys "^3.3.0"
|
eslint-visitor-keys "^3.3.0"
|
||||||
|
|
||||||
"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0":
|
"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1":
|
||||||
version "4.11.1"
|
version "4.12.1"
|
||||||
resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz"
|
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
|
||||||
integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==
|
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
|
||||||
|
|
||||||
"@eslint/config-array@^0.18.0":
|
"@eslint/config-array@^0.18.0":
|
||||||
version "0.18.0"
|
version "0.18.0"
|
||||||
@@ -692,10 +692,10 @@
|
|||||||
minimatch "^3.1.2"
|
minimatch "^3.1.2"
|
||||||
strip-json-comments "^3.1.1"
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
"@eslint/js@9.13.0", "@eslint/js@^9.13.0":
|
"@eslint/js@9.14.0", "@eslint/js@^9.13.0":
|
||||||
version "9.13.0"
|
version "9.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.13.0.tgz#c5f89bcd57eb54d5d4fa8b77693e9c28dc97e547"
|
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.14.0.tgz#2347a871042ebd11a00fd8c2d3d56a265ee6857e"
|
||||||
integrity sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==
|
integrity sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==
|
||||||
|
|
||||||
"@eslint/object-schema@^2.1.4":
|
"@eslint/object-schema@^2.1.4":
|
||||||
version "2.1.4"
|
version "2.1.4"
|
||||||
@@ -725,17 +725,17 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
ra-core "^4.16.2"
|
ra-core "^4.16.2"
|
||||||
|
|
||||||
"@humanfs/core@^0.19.0":
|
"@humanfs/core@^0.19.1":
|
||||||
version "0.19.0"
|
version "0.19.1"
|
||||||
resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.0.tgz#08db7a8c73bb07673d9ebd925f2dad746411fcec"
|
resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
|
||||||
integrity sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==
|
integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==
|
||||||
|
|
||||||
"@humanfs/node@^0.16.5":
|
"@humanfs/node@^0.16.6":
|
||||||
version "0.16.5"
|
version "0.16.6"
|
||||||
resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.5.tgz#a9febb7e7ad2aff65890fdc630938f8d20aa84ba"
|
resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e"
|
||||||
integrity sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==
|
integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@humanfs/core" "^0.19.0"
|
"@humanfs/core" "^0.19.1"
|
||||||
"@humanwhocodes/retry" "^0.3.0"
|
"@humanwhocodes/retry" "^0.3.0"
|
||||||
|
|
||||||
"@humanwhocodes/module-importer@^1.0.1":
|
"@humanwhocodes/module-importer@^1.0.1":
|
||||||
@@ -743,11 +743,16 @@
|
|||||||
resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
|
resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
|
||||||
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
|
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
|
||||||
|
|
||||||
"@humanwhocodes/retry@^0.3.0", "@humanwhocodes/retry@^0.3.1":
|
"@humanwhocodes/retry@^0.3.0":
|
||||||
version "0.3.1"
|
version "0.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a"
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a"
|
||||||
integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
|
integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
|
||||||
|
|
||||||
|
"@humanwhocodes/retry@^0.4.0":
|
||||||
|
version "0.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b"
|
||||||
|
integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==
|
||||||
|
|
||||||
"@istanbuljs/load-nyc-config@^1.0.0":
|
"@istanbuljs/load-nyc-config@^1.0.0":
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz"
|
resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz"
|
||||||
@@ -1184,10 +1189,10 @@
|
|||||||
resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
|
resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
|
||||||
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
|
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
|
||||||
|
|
||||||
"@remix-run/router@1.20.0":
|
"@remix-run/router@1.21.0":
|
||||||
version "1.20.0"
|
version "1.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4"
|
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5"
|
||||||
integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==
|
integrity sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi@4.22.4":
|
"@rollup/rollup-android-arm-eabi@4.22.4":
|
||||||
version "4.22.4"
|
version "4.22.4"
|
||||||
@@ -1293,17 +1298,17 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@sinonjs/commons" "^3.0.0"
|
"@sinonjs/commons" "^3.0.0"
|
||||||
|
|
||||||
"@tanstack/query-core@5.59.17":
|
"@tanstack/query-core@5.59.20":
|
||||||
version "5.59.17"
|
version "5.59.20"
|
||||||
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.59.17.tgz#bda3bb678be48e2f6ee692abd1cfc2db3d455e4b"
|
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.59.20.tgz#356718976536727b9af0ad1163a21fd6a44ee0a9"
|
||||||
integrity sha512-jWdDiif8kaqnRGHNXAa9CnudtxY5v9DUxXhodgqX2Rwzj+1UwStDHEbBd9IA5C7VYAaJ2s+BxFR6PUBs8ERorA==
|
integrity sha512-e8vw0lf7KwfGe1if4uPFhvZRWULqHjFcz3K8AebtieXvnMOz5FSzlZe3mTLlPuUBcydCnBRqYs2YJ5ys68wwLg==
|
||||||
|
|
||||||
"@tanstack/react-query@^5.59.19", "@tanstack/react-query@^5.8.4":
|
"@tanstack/react-query@^5.59.20", "@tanstack/react-query@^5.8.4":
|
||||||
version "5.59.19"
|
version "5.59.20"
|
||||||
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.59.19.tgz#309ae0d75844e331ea72762bfe0e11fb829a69d3"
|
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.59.20.tgz#bacf1983f44c5690bb99b518f2ef71dc2fa875a4"
|
||||||
integrity sha512-xLRfyFyQOFcLltKCds0LijfC6/HQJrrTTnZB8ciyn74LIkVAm++vZJ6eUVG20RmJtdP8REdy7vSOYW4M3//XLA==
|
integrity sha512-Zly0egsK0tFdfSbh5/mapSa+Zfc3Et0Zkar7Wo5sQkFzWyB3p3uZWOHR2wrlAEEV2L953eLuDBtbgFvMYiLvUw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@tanstack/query-core" "5.59.17"
|
"@tanstack/query-core" "5.59.20"
|
||||||
|
|
||||||
"@testing-library/dom@^10.0.0":
|
"@testing-library/dom@^10.0.0":
|
||||||
version "10.4.0"
|
version "10.4.0"
|
||||||
@@ -1536,62 +1541,62 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/yargs-parser" "*"
|
"@types/yargs-parser" "*"
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin@8.12.2", "@typescript-eslint/eslint-plugin@^8.11.0":
|
"@typescript-eslint/eslint-plugin@8.13.0", "@typescript-eslint/eslint-plugin@^8.11.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz#c2ef660bb83fd1432368319312a2581fc92ccac1"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz#650c50b8c795b5d092189f139f6d00535b5b0f3d"
|
||||||
integrity sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==
|
integrity sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/regexpp" "^4.10.0"
|
"@eslint-community/regexpp" "^4.10.0"
|
||||||
"@typescript-eslint/scope-manager" "8.12.2"
|
"@typescript-eslint/scope-manager" "8.13.0"
|
||||||
"@typescript-eslint/type-utils" "8.12.2"
|
"@typescript-eslint/type-utils" "8.13.0"
|
||||||
"@typescript-eslint/utils" "8.12.2"
|
"@typescript-eslint/utils" "8.13.0"
|
||||||
"@typescript-eslint/visitor-keys" "8.12.2"
|
"@typescript-eslint/visitor-keys" "8.13.0"
|
||||||
graphemer "^1.4.0"
|
graphemer "^1.4.0"
|
||||||
ignore "^5.3.1"
|
ignore "^5.3.1"
|
||||||
natural-compare "^1.4.0"
|
natural-compare "^1.4.0"
|
||||||
ts-api-utils "^1.3.0"
|
ts-api-utils "^1.3.0"
|
||||||
|
|
||||||
"@typescript-eslint/parser@8.12.2", "@typescript-eslint/parser@^8.11.0":
|
"@typescript-eslint/parser@8.13.0", "@typescript-eslint/parser@^8.13.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.12.2.tgz#2e8173b34e1685e918b2d571c16c906d3747bad2"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.13.0.tgz#ef76203b7cac515aa3ccc4f7ce5320dd61c46b29"
|
||||||
integrity sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==
|
integrity sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/scope-manager" "8.12.2"
|
"@typescript-eslint/scope-manager" "8.13.0"
|
||||||
"@typescript-eslint/types" "8.12.2"
|
"@typescript-eslint/types" "8.13.0"
|
||||||
"@typescript-eslint/typescript-estree" "8.12.2"
|
"@typescript-eslint/typescript-estree" "8.13.0"
|
||||||
"@typescript-eslint/visitor-keys" "8.12.2"
|
"@typescript-eslint/visitor-keys" "8.13.0"
|
||||||
debug "^4.3.4"
|
debug "^4.3.4"
|
||||||
|
|
||||||
"@typescript-eslint/scope-manager@8.12.2":
|
"@typescript-eslint/scope-manager@8.13.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz#6db0213745e6392c8e90fe9af5915e6da32eb94a"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz#2f4aed0b87d72360e64e4ea194b1fde14a59082e"
|
||||||
integrity sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==
|
integrity sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "8.12.2"
|
"@typescript-eslint/types" "8.13.0"
|
||||||
"@typescript-eslint/visitor-keys" "8.12.2"
|
"@typescript-eslint/visitor-keys" "8.13.0"
|
||||||
|
|
||||||
"@typescript-eslint/type-utils@8.12.2":
|
"@typescript-eslint/type-utils@8.13.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz#132b0c52d45f6814e6f2e32416c7951ed480b016"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz#8c8fa68490dcb9ae1687ffc7de8fbe23c26417bd"
|
||||||
integrity sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==
|
integrity sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/typescript-estree" "8.12.2"
|
"@typescript-eslint/typescript-estree" "8.13.0"
|
||||||
"@typescript-eslint/utils" "8.12.2"
|
"@typescript-eslint/utils" "8.13.0"
|
||||||
debug "^4.3.4"
|
debug "^4.3.4"
|
||||||
ts-api-utils "^1.3.0"
|
ts-api-utils "^1.3.0"
|
||||||
|
|
||||||
"@typescript-eslint/types@8.12.2":
|
"@typescript-eslint/types@8.13.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.12.2.tgz#8d70098c0e90442495b53d0296acdca6d0f3f73c"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.13.0.tgz#3f35dead2b2491a04339370dcbcd17bbdfc204d8"
|
||||||
integrity sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==
|
integrity sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree@8.12.2":
|
"@typescript-eslint/typescript-estree@8.13.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz#206df9b1cbff212aaa9401985ef99f04daa84da5"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz#db8c93dd5437ca3ce417a255fb35ddc3c12c3e95"
|
||||||
integrity sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==
|
integrity sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "8.12.2"
|
"@typescript-eslint/types" "8.13.0"
|
||||||
"@typescript-eslint/visitor-keys" "8.12.2"
|
"@typescript-eslint/visitor-keys" "8.13.0"
|
||||||
debug "^4.3.4"
|
debug "^4.3.4"
|
||||||
fast-glob "^3.3.2"
|
fast-glob "^3.3.2"
|
||||||
is-glob "^4.0.3"
|
is-glob "^4.0.3"
|
||||||
@@ -1599,22 +1604,22 @@
|
|||||||
semver "^7.6.0"
|
semver "^7.6.0"
|
||||||
ts-api-utils "^1.3.0"
|
ts-api-utils "^1.3.0"
|
||||||
|
|
||||||
"@typescript-eslint/utils@8.12.2":
|
"@typescript-eslint/utils@8.13.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.12.2.tgz#726cc9f49f5866605bd15bbc1768ffc15637930e"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.13.0.tgz#f6d40e8b5053dcaeabbd2e26463857abf27d62c0"
|
||||||
integrity sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==
|
integrity sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/eslint-utils" "^4.4.0"
|
"@eslint-community/eslint-utils" "^4.4.0"
|
||||||
"@typescript-eslint/scope-manager" "8.12.2"
|
"@typescript-eslint/scope-manager" "8.13.0"
|
||||||
"@typescript-eslint/types" "8.12.2"
|
"@typescript-eslint/types" "8.13.0"
|
||||||
"@typescript-eslint/typescript-estree" "8.12.2"
|
"@typescript-eslint/typescript-estree" "8.13.0"
|
||||||
|
|
||||||
"@typescript-eslint/visitor-keys@8.12.2":
|
"@typescript-eslint/visitor-keys@8.13.0":
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz#94d7410f78eb6d134b9fcabaf1eeedb910ba8c38"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz#e97b0d92b266ef38a1faf40a74da289b66683a5b"
|
||||||
integrity sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==
|
integrity sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/types" "8.12.2"
|
"@typescript-eslint/types" "8.13.0"
|
||||||
eslint-visitor-keys "^3.4.3"
|
eslint-visitor-keys "^3.4.3"
|
||||||
|
|
||||||
"@vitejs/plugin-react@^4.3.3":
|
"@vitejs/plugin-react@^4.3.3":
|
||||||
@@ -1658,10 +1663,10 @@ acorn@^8.1.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.1:
|
|||||||
resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz"
|
resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz"
|
||||||
integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
|
integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
|
||||||
|
|
||||||
acorn@^8.12.0:
|
acorn@^8.14.0:
|
||||||
version "8.13.0"
|
version "8.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
|
||||||
integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==
|
integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
|
||||||
|
|
||||||
agent-base@6:
|
agent-base@6:
|
||||||
version "6.0.2"
|
version "6.0.2"
|
||||||
@@ -2756,10 +2761,10 @@ eslint-plugin-yaml@^1.0.3:
|
|||||||
js-yaml "^4.1.0"
|
js-yaml "^4.1.0"
|
||||||
jshint "^2.13.6"
|
jshint "^2.13.6"
|
||||||
|
|
||||||
eslint-scope@^8.1.0:
|
eslint-scope@^8.2.0:
|
||||||
version "8.1.0"
|
version "8.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30"
|
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442"
|
||||||
integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==
|
integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==
|
||||||
dependencies:
|
dependencies:
|
||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^5.2.0"
|
estraverse "^5.2.0"
|
||||||
@@ -2769,26 +2774,26 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
|
|||||||
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
|
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
|
||||||
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
|
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
|
||||||
|
|
||||||
eslint-visitor-keys@^4.1.0:
|
eslint-visitor-keys@^4.2.0:
|
||||||
version "4.1.0"
|
version "4.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
|
||||||
integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==
|
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
|
||||||
|
|
||||||
eslint@^9.13.0:
|
eslint@^9.14.0:
|
||||||
version "9.13.0"
|
version "9.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.13.0.tgz#7659014b7dda1ff876ecbd990f726e11c61596e6"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.14.0.tgz#534180a97c00af08bcf2b60b0ebf0c4d6c1b2c95"
|
||||||
integrity sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==
|
integrity sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/eslint-utils" "^4.2.0"
|
"@eslint-community/eslint-utils" "^4.2.0"
|
||||||
"@eslint-community/regexpp" "^4.11.0"
|
"@eslint-community/regexpp" "^4.12.1"
|
||||||
"@eslint/config-array" "^0.18.0"
|
"@eslint/config-array" "^0.18.0"
|
||||||
"@eslint/core" "^0.7.0"
|
"@eslint/core" "^0.7.0"
|
||||||
"@eslint/eslintrc" "^3.1.0"
|
"@eslint/eslintrc" "^3.1.0"
|
||||||
"@eslint/js" "9.13.0"
|
"@eslint/js" "9.14.0"
|
||||||
"@eslint/plugin-kit" "^0.2.0"
|
"@eslint/plugin-kit" "^0.2.0"
|
||||||
"@humanfs/node" "^0.16.5"
|
"@humanfs/node" "^0.16.6"
|
||||||
"@humanwhocodes/module-importer" "^1.0.1"
|
"@humanwhocodes/module-importer" "^1.0.1"
|
||||||
"@humanwhocodes/retry" "^0.3.1"
|
"@humanwhocodes/retry" "^0.4.0"
|
||||||
"@types/estree" "^1.0.6"
|
"@types/estree" "^1.0.6"
|
||||||
"@types/json-schema" "^7.0.15"
|
"@types/json-schema" "^7.0.15"
|
||||||
ajv "^6.12.4"
|
ajv "^6.12.4"
|
||||||
@@ -2796,9 +2801,9 @@ eslint@^9.13.0:
|
|||||||
cross-spawn "^7.0.2"
|
cross-spawn "^7.0.2"
|
||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
escape-string-regexp "^4.0.0"
|
escape-string-regexp "^4.0.0"
|
||||||
eslint-scope "^8.1.0"
|
eslint-scope "^8.2.0"
|
||||||
eslint-visitor-keys "^4.1.0"
|
eslint-visitor-keys "^4.2.0"
|
||||||
espree "^10.2.0"
|
espree "^10.3.0"
|
||||||
esquery "^1.5.0"
|
esquery "^1.5.0"
|
||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
fast-deep-equal "^3.1.3"
|
fast-deep-equal "^3.1.3"
|
||||||
@@ -2815,14 +2820,14 @@ eslint@^9.13.0:
|
|||||||
optionator "^0.9.3"
|
optionator "^0.9.3"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
espree@^10.0.1, espree@^10.2.0:
|
espree@^10.0.1, espree@^10.3.0:
|
||||||
version "10.2.0"
|
version "10.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a"
|
||||||
integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==
|
integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
|
||||||
dependencies:
|
dependencies:
|
||||||
acorn "^8.12.0"
|
acorn "^8.14.0"
|
||||||
acorn-jsx "^5.3.2"
|
acorn-jsx "^5.3.2"
|
||||||
eslint-visitor-keys "^4.1.0"
|
eslint-visitor-keys "^4.2.0"
|
||||||
|
|
||||||
esprima@^4.0.0, esprima@^4.0.1:
|
esprima@^4.0.0, esprima@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
@@ -4643,10 +4648,10 @@ ra-core@^4.11.2, ra-core@^4.16.2:
|
|||||||
react-is "^17.0.2"
|
react-is "^17.0.2"
|
||||||
react-query "^3.32.1"
|
react-query "^3.32.1"
|
||||||
|
|
||||||
ra-core@^5.3.1, ra-core@^5.3.2:
|
ra-core@^5.3.2, ra-core@^5.3.3:
|
||||||
version "5.3.2"
|
version "5.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/ra-core/-/ra-core-5.3.2.tgz#8d60096f9bd3b88339fa798f42be21791813199e"
|
resolved "https://registry.yarnpkg.com/ra-core/-/ra-core-5.3.3.tgz#b9ca8bb9517718b444f291f5ccf5ff45bf28feef"
|
||||||
integrity sha512-JDZ44jMCTlAXWWdR8LLFXXjKIc6bNf4L/zjY9/iL9yP5Kcy4yNf4kTBzR46dNWpt5/3k4Z59cMKBf+A9fDjJAQ==
|
integrity sha512-M1EyuSyc6QCblRWUtNklgcK3mnh34SnKF01JOuIcncaKW0DQhLE7R9sagBVTJ44ZxxZGBSweW6+Ah8YZ162cCg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@tanstack/react-query" "^5.8.4"
|
"@tanstack/react-query" "^5.8.4"
|
||||||
clsx "^2.1.1"
|
clsx "^2.1.1"
|
||||||
@@ -4659,32 +4664,32 @@ ra-core@^5.3.1, ra-core@^5.3.2:
|
|||||||
react-error-boundary "^4.0.13"
|
react-error-boundary "^4.0.13"
|
||||||
react-is "^18.2.0"
|
react-is "^18.2.0"
|
||||||
|
|
||||||
ra-i18n-polyglot@^5.3.1, ra-i18n-polyglot@^5.3.2:
|
ra-i18n-polyglot@^5.3.2, ra-i18n-polyglot@^5.3.3:
|
||||||
version "5.3.2"
|
version "5.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/ra-i18n-polyglot/-/ra-i18n-polyglot-5.3.2.tgz#7da554550fe8e7d2a2028d68280767a9392603cb"
|
resolved "https://registry.yarnpkg.com/ra-i18n-polyglot/-/ra-i18n-polyglot-5.3.3.tgz#d85c5b9496660454e815d64682f40dbd6ccb4347"
|
||||||
integrity sha512-jyaDTPKyJOZlMnvLnrw7dqpD/ek01iVFg73FGoI3PAD/xYwKj4AfJBvwWlLVwlc6TOz9fcwd4hTWWVKbOMMFbA==
|
integrity sha512-IqTg364wwPjz+DssVTKe6tKwyCp9336yHhjwil8/xnANLJvEVU6jz4JfQniT9RDg2HtA895hAR/o21dazzXsOg==
|
||||||
dependencies:
|
dependencies:
|
||||||
node-polyglot "^2.2.2"
|
node-polyglot "^2.2.2"
|
||||||
ra-core "^5.3.2"
|
ra-core "^5.3.3"
|
||||||
|
|
||||||
ra-language-english@^5.3.1, ra-language-english@^5.3.2:
|
ra-language-english@^5.3.2, ra-language-english@^5.3.3:
|
||||||
version "5.3.2"
|
version "5.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/ra-language-english/-/ra-language-english-5.3.2.tgz#9d4fc545b05bda945c9ec96d60203ca2d560f632"
|
resolved "https://registry.yarnpkg.com/ra-language-english/-/ra-language-english-5.3.3.tgz#9f532dd2471d3b9ae818245044d186d5b27c707e"
|
||||||
integrity sha512-otfNWGAyRXuaEBYneYpNaNj96umOLQ+MVtWPJSHvHXq80nRL0y2tEy0RNDrdIayvF6Q9dRYs1Q7a+mV0tkNbAw==
|
integrity sha512-MM8y1R+Ts8Q9Vn+lph27kFwscs+lzMb+xmtDSQIK0/1Fq8f96JA8ogw0u+lKGhTA7t1iudjulBlD/mnuYZJoGg==
|
||||||
dependencies:
|
dependencies:
|
||||||
ra-core "^5.3.2"
|
ra-core "^5.3.3"
|
||||||
|
|
||||||
ra-language-farsi@^5.0.0:
|
ra-language-farsi@^5.0.0:
|
||||||
version "5.0.0"
|
version "5.0.0"
|
||||||
resolved "https://registry.npmjs.org/ra-language-farsi/-/ra-language-farsi-5.0.0.tgz"
|
resolved "https://registry.npmjs.org/ra-language-farsi/-/ra-language-farsi-5.0.0.tgz"
|
||||||
integrity sha512-wdveom01mdPY3KiFBWj4cc1f1YhWWi4pqNIuY79jgbJ43Kk72qOQIr3byWipy/Nt7dYzrAP3IvXmylWLLMmgnw==
|
integrity sha512-wdveom01mdPY3KiFBWj4cc1f1YhWWi4pqNIuY79jgbJ43Kk72qOQIr3byWipy/Nt7dYzrAP3IvXmylWLLMmgnw==
|
||||||
|
|
||||||
ra-language-french@^5.3.1:
|
ra-language-french@^5.3.3:
|
||||||
version "5.3.1"
|
version "5.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/ra-language-french/-/ra-language-french-5.3.1.tgz#e7a555af44b4c227bf29ce902db40c82eb5c022a"
|
resolved "https://registry.yarnpkg.com/ra-language-french/-/ra-language-french-5.3.3.tgz#38bfe37ef991a31596cd2b5230d0393a1c51a4ab"
|
||||||
integrity sha512-qJxKGDpL2KYQ7U0s5WsjcAvEbJJITduD/QXNUS4PJCDuijekiH9BwzL3kHE8PxdxJHsBS5djPEAxzD9IW8jfiw==
|
integrity sha512-N5r6qUpEIkyxU4dFf+57kBaugPPWJ1ZCJ0Y9bnqrvENdsxcYDZwXx1hWUP4TU69iynEnsCCwkl8Sxcbo37vJ2Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
ra-core "^5.3.1"
|
ra-core "^5.3.3"
|
||||||
|
|
||||||
ra-language-italian@^3.13.1:
|
ra-language-italian@^3.13.1:
|
||||||
version "3.13.1"
|
version "3.13.1"
|
||||||
@@ -4698,10 +4703,10 @@ ra-language-russian@^4.14.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ra-core "^4.16.2"
|
ra-core "^4.16.2"
|
||||||
|
|
||||||
ra-ui-materialui@^5.3.1:
|
ra-ui-materialui@^5.3.3:
|
||||||
version "5.3.1"
|
version "5.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/ra-ui-materialui/-/ra-ui-materialui-5.3.1.tgz#67ca58752519b6ea430d5fba13bb0e5496479e77"
|
resolved "https://registry.yarnpkg.com/ra-ui-materialui/-/ra-ui-materialui-5.3.3.tgz#2f928e668c0242f2e103afc96016a108256dc23e"
|
||||||
integrity sha512-ViLAtCVsdAPrdT72K1W2a00UkZZI0FSw8YTsrPBPPjLfaH1MpjEAG2cwI9ODuPDe65/GkiM1W0husWV5JveLnw==
|
integrity sha512-zaODfIoN+uc/9wuzlgFA0CHWZPpHs8kxtSi4i2HwBEFY42x/UoPsCqsRgLYGGJofBqxlD1UqzFRuVAKTEM/1bg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@tanstack/react-query" "^5.8.4"
|
"@tanstack/react-query" "^5.8.4"
|
||||||
autosuggest-highlight "^3.1.1"
|
autosuggest-highlight "^3.1.1"
|
||||||
@@ -4716,19 +4721,19 @@ ra-ui-materialui@^5.3.1:
|
|||||||
react-error-boundary "^4.0.13"
|
react-error-boundary "^4.0.13"
|
||||||
react-transition-group "^4.4.5"
|
react-transition-group "^4.4.5"
|
||||||
|
|
||||||
react-admin@^5.3.1:
|
react-admin@^5.3.3:
|
||||||
version "5.3.1"
|
version "5.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/react-admin/-/react-admin-5.3.1.tgz#9748328c3671c228cf45809ae2123bfc76423e53"
|
resolved "https://registry.yarnpkg.com/react-admin/-/react-admin-5.3.3.tgz#0db4d69db7eca3e0bfcb42858e069b6710c8bed8"
|
||||||
integrity sha512-pxEccGTXwreI0EhPgssp0B8fWMk68fCmpHImjVZ8SJ//zXWncffwcbRwb7HbvkF56Zp3ivx9UIZ/vvuBCjN49g==
|
integrity sha512-TAN3G7/JHQZpR1CieREjYFepSkQQdS4b70k060UVkeUL4RRU1c9whDfnSsUVuO56mnxTBKpQx0e/VHablSmBwA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@emotion/react" "^11.4.1"
|
"@emotion/react" "^11.4.1"
|
||||||
"@emotion/styled" "^11.3.0"
|
"@emotion/styled" "^11.3.0"
|
||||||
"@mui/icons-material" "^5.15.20"
|
"@mui/icons-material" "^5.15.20"
|
||||||
"@mui/material" "^5.15.20"
|
"@mui/material" "^5.15.20"
|
||||||
ra-core "^5.3.1"
|
ra-core "^5.3.3"
|
||||||
ra-i18n-polyglot "^5.3.1"
|
ra-i18n-polyglot "^5.3.3"
|
||||||
ra-language-english "^5.3.1"
|
ra-language-english "^5.3.3"
|
||||||
ra-ui-materialui "^5.3.1"
|
ra-ui-materialui "^5.3.3"
|
||||||
react-hook-form "^7.53.0"
|
react-hook-form "^7.53.0"
|
||||||
react-router "^6.22.0"
|
react-router "^6.22.0"
|
||||||
react-router-dom "^6.22.0"
|
react-router-dom "^6.22.0"
|
||||||
@@ -4791,20 +4796,20 @@ react-refresh@^0.14.2:
|
|||||||
resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz"
|
resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz"
|
||||||
integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==
|
integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==
|
||||||
|
|
||||||
react-router-dom@^6.22.0, react-router-dom@^6.27.0:
|
react-router-dom@^6.22.0, react-router-dom@^6.28.0:
|
||||||
version "6.27.0"
|
version "6.28.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.27.0.tgz#8d7972a425fd75f91c1e1ff67e47240c5752dc3f"
|
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.28.0.tgz#f73ebb3490e59ac9f299377062ad1d10a9f579e6"
|
||||||
integrity sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==
|
integrity sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@remix-run/router" "1.20.0"
|
"@remix-run/router" "1.21.0"
|
||||||
react-router "6.27.0"
|
react-router "6.28.0"
|
||||||
|
|
||||||
react-router@6.27.0, react-router@^6.22.0, react-router@^6.26.2:
|
react-router@6.28.0, react-router@^6.22.0, react-router@^6.26.2:
|
||||||
version "6.27.0"
|
version "6.28.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.27.0.tgz#db292474926c814c996c0ff3ef0162d1f9f60ed4"
|
resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.28.0.tgz#29247c86d7ba901d7e5a13aa79a96723c3e59d0d"
|
||||||
integrity sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==
|
integrity sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@remix-run/router" "1.20.0"
|
"@remix-run/router" "1.21.0"
|
||||||
|
|
||||||
react-shallow-renderer@^16.15.0:
|
react-shallow-renderer@^16.15.0:
|
||||||
version "16.15.0"
|
version "16.15.0"
|
||||||
@@ -5435,14 +5440,14 @@ typed-array-length@^1.0.6:
|
|||||||
is-typed-array "^1.1.13"
|
is-typed-array "^1.1.13"
|
||||||
possible-typed-array-names "^1.0.0"
|
possible-typed-array-names "^1.0.0"
|
||||||
|
|
||||||
typescript-eslint@^8.12.2:
|
typescript-eslint@^8.13.0:
|
||||||
version "8.12.2"
|
version "8.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.12.2.tgz#e273d69af30b478b1c410f4159d675ce7925f9a7"
|
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.13.0.tgz#c7d92cc06188176c7d0e3825e10305b9c22fb102"
|
||||||
integrity sha512-UbuVUWSrHVR03q9CWx+JDHeO6B/Hr9p4U5lRH++5tq/EbFq1faYZe50ZSBePptgfIKLEti0aPQ3hFgnPVcd8ZQ==
|
integrity sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/eslint-plugin" "8.12.2"
|
"@typescript-eslint/eslint-plugin" "8.13.0"
|
||||||
"@typescript-eslint/parser" "8.12.2"
|
"@typescript-eslint/parser" "8.13.0"
|
||||||
"@typescript-eslint/utils" "8.12.2"
|
"@typescript-eslint/utils" "8.13.0"
|
||||||
|
|
||||||
typescript@^5.6.3:
|
typescript@^5.6.3:
|
||||||
version "5.6.3"
|
version "5.6.3"
|
||||||
|
Reference in New Issue
Block a user