Compare commits
1 Commits
v0.11.1-et
...
add-some-t
Author | SHA1 | Date | |
---|---|---|---|
![]() |
319c7aa33a |
2
.github/workflows/workflow.yml
vendored
2
.github/workflows/workflow.yml
vendored
@@ -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@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
context: .
|
||||
|
@@ -113,9 +113,6 @@ The following changes are already implemented:
|
||||
* 🗂️ [Add Users' Account Data tab](https://github.com/etkecc/synapse-admin/pull/276)
|
||||
* 🧾 [Make bulk registration CSV import more user-friendly](https://github.com/etkecc/synapse-admin/pull/411)
|
||||
* 🌐 [Configurable CORS Credentials](https://github.com/etkecc/synapse-admin/pull/456)
|
||||
* [Do not check homeserver URL during typing in the login form](https://github.com/etkecc/synapse-admin/pull/585)
|
||||
* [Improve user account status toggles](https://github.com/etkecc/synapse-admin/pull/608)
|
||||
* [Validate that password is entered upon reactivation of account](https://github.com/etkecc/synapse-admin/pull/609)
|
||||
|
||||
#### exclusive for [etke.cc](https://etke.cc) customers
|
||||
|
||||
|
@@ -9,7 +9,7 @@ You can do that for a single homeserver or multiple homeservers at once, as `res
|
||||
an array of strings.
|
||||
|
||||
The examples below contain the configuration settings to restrict the Synapse Admin instance to work only with
|
||||
`example.com` (with Synapse running at `matrix.example.com`) and
|
||||
`example.com` (with Synapse runing at `matrix.example.com`) and
|
||||
`example.net` (with Synapse running at `synapse.example.net`) homeservers.
|
||||
Note that the homeserver URL should be the _actual_ homeserver URL, and not the delegated one.
|
||||
|
||||
|
3
justfile
3
justfile
@@ -6,9 +6,6 @@ default:
|
||||
build: __install
|
||||
@yarn run build --base=./
|
||||
|
||||
update:
|
||||
yarn upgrade-interactive --latest
|
||||
|
||||
# run the app in a development mode
|
||||
run:
|
||||
@yarn start --host 0.0.0.0
|
||||
|
36
package.json
36
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "synapse-admin",
|
||||
"version": "0.11.1",
|
||||
"version": "0.10.3",
|
||||
"description": "Admin GUI for the Matrix.org server Synapse",
|
||||
"type": "module",
|
||||
"author": "etke.cc (originally by Awesome Technologies Innovationslabor GmbH)",
|
||||
@@ -17,18 +17,18 @@
|
||||
"@testing-library/react": "^16.3.0",
|
||||
"@testing-library/user-event": "^14.6.1",
|
||||
"@types/jest": "^29.5.14",
|
||||
"@types/lodash": "^4.17.17",
|
||||
"@types/node": "^22.15.30",
|
||||
"@types/lodash": "^4.17.16",
|
||||
"@types/node": "^22.15.19",
|
||||
"@types/papaparse": "^5.3.16",
|
||||
"@types/react": "^19.1.6",
|
||||
"@types/react": "^19.1.4",
|
||||
"@typescript-eslint/eslint-plugin": "^8.32.0",
|
||||
"@typescript-eslint/parser": "^8.32.0",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"eslint": "^9.28.0",
|
||||
"@vitejs/plugin-react": "^4.4.1",
|
||||
"eslint": "^9.27.0",
|
||||
"eslint-config-prettier": "^10.1.5",
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||
"eslint-plugin-prettier": "^5.4.1",
|
||||
"eslint-plugin-prettier": "^5.4.0",
|
||||
"eslint-plugin-unused-imports": "^4.1.4",
|
||||
"jest": "^29.7.0",
|
||||
"jest-environment-jsdom": "^29.7.0",
|
||||
@@ -38,7 +38,7 @@
|
||||
"ts-jest": "^29.3.4",
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.33.1",
|
||||
"typescript-eslint": "^8.32.1",
|
||||
"vite": "^6.3.5",
|
||||
"vite-plugin-version-mark": "^0.1.4"
|
||||
},
|
||||
@@ -47,29 +47,29 @@
|
||||
"@emotion/styled": "^11.14.0",
|
||||
"@haleos/ra-language-german": "^1.0.0",
|
||||
"@haxqer/ra-language-chinese": "^4.16.2",
|
||||
"@mui/icons-material": "^7.1.1",
|
||||
"@mui/material": "^7.1.1",
|
||||
"@mui/icons-material": "^6.4.8",
|
||||
"@mui/material": "^6.4.8",
|
||||
"@mui/utils": "^7.1.0",
|
||||
"@tanstack/react-query": "^5.80.6",
|
||||
"@tanstack/react-query": "^5.76.1",
|
||||
"history": "^5.3.0",
|
||||
"jest-fixed-jsdom": "^0.0.9",
|
||||
"lodash": "^4.17.21",
|
||||
"papaparse": "^5.5.3",
|
||||
"papaparse": "^5.5.1",
|
||||
"ra-core": "^5.4.4",
|
||||
"ra-i18n-polyglot": "^5.4.4",
|
||||
"ra-language-english": "^5.4.4",
|
||||
"ra-language-farsi": "^5.1.0",
|
||||
"ra-language-french": "^5.8.3",
|
||||
"ra-language-french": "^5.8.2",
|
||||
"ra-language-italian": "^3.13.1",
|
||||
"ra-language-russian": "^5.4.4",
|
||||
"ra-language-russian": "^5.4.3",
|
||||
"react": "^19.1.0",
|
||||
"react-admin": "^5.8.3",
|
||||
"react-admin": "^5.8.2",
|
||||
"react-dom": "^19.1.0",
|
||||
"react-hook-form": "^7.57.0",
|
||||
"react-hook-form": "^7.56.4",
|
||||
"react-is": "^19.1.0",
|
||||
"ts-jest-mock-import-meta": "^1.3.0",
|
||||
"react-router": "^7.6.0",
|
||||
"react-router-dom": "^7.6.2",
|
||||
"ts-jest-mock-import-meta": "^1.3.0"
|
||||
"react-router-dom": "^7.6.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "vite serve",
|
||||
|
@@ -59,7 +59,6 @@ export const App = () => (
|
||||
<Admin
|
||||
disableTelemetry
|
||||
requireAuth
|
||||
title="Synapse Admin"
|
||||
layout={AdminLayout}
|
||||
loginPage={LoginPage}
|
||||
authProvider={authProvider}
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
|
@@ -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"
|
||||
@@ -74,7 +75,7 @@ export const ExperimentalFeaturesList = () => {
|
||||
const updateFeature = async (feature_name: string, feature_value: boolean) => {
|
||||
const updatedFeatures = { ...features, [feature_name]: feature_value } as ExperimentalFeaturesModel;
|
||||
setFeatures(updatedFeatures);
|
||||
const response = await dataProvider.updateFeatures(record.id, updatedFeatures);
|
||||
const reponse = await dataProvider.updateFeatures(record.id, updatedFeatures);
|
||||
notify("ra.notification.updated", {
|
||||
messageArgs: { smart_count: 1 },
|
||||
type: "success",
|
||||
|
@@ -40,7 +40,7 @@ const UserAccountData = () => {
|
||||
<>
|
||||
<Stack direction="column" spacing={2} width="100%">
|
||||
<Typography variant="h6">{translate("resources.users.account_data.title")}</Typography>
|
||||
<Typography variant="body1" component="div">
|
||||
<Typography variant="body1">
|
||||
<Box>
|
||||
<Accordion>
|
||||
<AccordionSummary expandIcon={<ArrowDownwardIcon />}>
|
||||
|
@@ -33,6 +33,7 @@ const RateLimitRow = ({
|
||||
}}
|
||||
>
|
||||
<TextField
|
||||
id="outlined-number"
|
||||
type="number"
|
||||
value={value}
|
||||
onChange={handleChange}
|
||||
|
@@ -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>
|
||||
);
|
||||
};
|
||||
|
@@ -204,14 +204,11 @@ const de: SynapseTranslationMessages = {
|
||||
},
|
||||
helper: {
|
||||
password: "Durch die Änderung des Passworts wird der Benutzer von allen Sitzungen abgemeldet.",
|
||||
password_required_for_reactivation: "Sie müssen ein Passwort angeben, um ein Konto wieder zu aktivieren.",
|
||||
create_password: "Generiere ein starkes und sicheres Passwort mit dem Button unten.",
|
||||
deactivate: "Sie müssen ein Passwort angeben, um ein Konto wieder zu aktivieren.",
|
||||
suspend:
|
||||
"Ein gesperrter Benutzer kann sich nicht mehr anmelden und wird in den schreibgeschützten Modus versetzt.",
|
||||
erase: "DSGVO konformes Löschen der Benutzerdaten.",
|
||||
admin: "Ein Serveradministrator hat volle Kontrolle über den Server und seine Benutzer.",
|
||||
lock: "Verhindert, dass der Benutzer den Server nutzen kann. Dies ist eine nicht-destruktive Aktion, die rückgängig gemacht werden kann.",
|
||||
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.",
|
||||
|
@@ -171,13 +171,10 @@ const en: SynapseTranslationMessages = {
|
||||
},
|
||||
helper: {
|
||||
password: "Changing password will log user out of all sessions.",
|
||||
password_required_for_reactivation: "You must provide a password to re-activate an account.",
|
||||
create_password: "Generate a strong and secure password using the button below.",
|
||||
lock: "Prevent the user from usefully using their account. This is a non-destructive action that can be reversed.",
|
||||
deactivate: "You must provide a password to re-activate an account.",
|
||||
suspend: "Suspending user means they are put into a read-only mode.",
|
||||
erase: "In addition to deactivating the user, mark the user as GDPR-erased.",
|
||||
admin: "A server administrator has full control over the server and its users.",
|
||||
erase: "Mark the user as GDPR-erased",
|
||||
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.",
|
||||
|
@@ -162,9 +162,6 @@ const fa: SynapseTranslationMessages = {
|
||||
user_type: "نوع کاربر",
|
||||
},
|
||||
helper: {
|
||||
password_required_for_reactivation: "برای فعالسازی مجدد حساب باید رمز عبور وارد کنید.",
|
||||
admin: "مدیر سرور دارای کنترل کامل بر روی سرور و کاربران آن است.",
|
||||
lock: "ممنوعیت استفاده از سرور توسط کاربر. این یک عملیات غیر مخرب است که می تواند برگردانده شود.",
|
||||
password: "با تغییر رمز عبور کاربر از تمام دستگاه ها خارج می شود.",
|
||||
create_password: "رمز عبور قوی و امنی را با استفاده از دکمه زیر ایجاد کنید.",
|
||||
deactivate: "برای فعالسازی مجدد حساب باید رمز عبور وارد کنید.",
|
||||
|
@@ -170,13 +170,10 @@ const fr: SynapseTranslationMessages = {
|
||||
},
|
||||
helper: {
|
||||
password: "Changer le mot de passe déconnectera l'utilisateur de toutes les sessions.",
|
||||
password_required_for_reactivation: "Vous devez fournir un mot de passe pour réactiver le compte.",
|
||||
create_password: "Générer un mot de passe fort et sécurisé en utilisant le bouton ci-dessous.",
|
||||
deactivate: "Vous devrez fournir un mot de passe pour réactiver le compte.",
|
||||
suspend: "L'utilisateur sera suspendu jusqu'à ce que vous le réactiviez.",
|
||||
erase: "Marquer l'utilisateur comme effacé conformément au RGPD",
|
||||
admin: "Un administrateur de serveur a un contrôle total sur le serveur et ses utilisateurs.",
|
||||
lock: "Empêche l'utilisateur d'utiliser le serveur. C'est une action non destructive qui peut être annulée.",
|
||||
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.",
|
||||
|
3
src/i18n/index.d.ts
vendored
3
src/i18n/index.d.ts
vendored
@@ -161,12 +161,9 @@ interface SynapseTranslationMessages extends TranslationMessages {
|
||||
};
|
||||
helper: {
|
||||
password: string;
|
||||
password_required_for_reactivation: string;
|
||||
create_password: string;
|
||||
lock: string;
|
||||
deactivate: string;
|
||||
suspend: string;
|
||||
admin: string;
|
||||
erase: string;
|
||||
erase_text: string;
|
||||
erase_admin_error: string;
|
||||
|
@@ -163,13 +163,10 @@ const it: SynapseTranslationMessages = {
|
||||
},
|
||||
helper: {
|
||||
password: "Cambiando la password l'utente verrà disconnesso da tutte le sessioni attive.",
|
||||
password_required_for_reactivation: "Devi fornire una password per riattivare l'account.",
|
||||
create_password: "Genera una password forte e sicura utilizzando il pulsante sottostante.",
|
||||
deactivate: "Devi fornire una password per riattivare l'account.",
|
||||
suspend: "Sospendi l'utente",
|
||||
erase: "Constrassegna l'utente come cancellato dal GDPR",
|
||||
admin: "Un amministratore del server ha controllo totale sul server e sui suoi utenti.",
|
||||
lock: "Impedisce all'utente di utilizzare il server. Questa è un'azione non distruttiva che può essere annullata.",
|
||||
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.",
|
||||
|
@@ -208,14 +208,11 @@ const ru: SynapseTranslationMessages = {
|
||||
},
|
||||
helper: {
|
||||
password: "Смена пароля завершит все сессии пользователя.",
|
||||
password_required_for_reactivation: "Вы должны предоставить пароль для реактивации учётной записи.",
|
||||
create_password: "Сгенерировать надёжный и безопасный пароль, используя кнопку ниже.",
|
||||
deactivate: "Вы должны предоставить пароль для реактивации учётной записи.",
|
||||
suspend:
|
||||
"Приостановка учётной записи означает, что пользователь не сможет войти в свою учётную запись, пока она не будет снова активирована.",
|
||||
erase: "Пометить пользователя как удалённого в соответствии с GDPR",
|
||||
admin: "Администратор сервера имеет полный контроль над сервером и его пользователями.",
|
||||
lock: "Предотвращает использование пользователем сервера. Это неразрушающее действие, которое может быть отменено.",
|
||||
erase_text:
|
||||
"Это означает, что сообщения, отправленные пользователем (-ами), будут по-прежнему видны всем, кто находился в комнате в момент их отправки, но будут скрыты от пользователей, присоединившихся к комнате после этого.",
|
||||
erase_admin_error: "Удаление собственного пользователя запрещено.",
|
||||
|
@@ -193,13 +193,10 @@ const zh: SynapseTranslationMessages = {
|
||||
},
|
||||
helper: {
|
||||
password: "更改密码会使用户注销所有会话。",
|
||||
password_required_for_reactivation: "您必须提供一串密码来激活账户。",
|
||||
create_password: "使用下面的按钮生成一个强大和安全的密码。",
|
||||
deactivate: "您必须提供一串密码来激活账户。",
|
||||
suspend: "您必须提供一串密码来暂停账户。",
|
||||
erase: "将用户标记为根据 GDPR 的要求抹除了",
|
||||
admin: "服务器管理员对服务器和其用户有完全的控制权。",
|
||||
lock: "阻止用户使用服务器。这是一个非破坏性的操作,可以被撤销。",
|
||||
erase_text:
|
||||
"这意味着用户发送的信息对于发送信息时在房间内的任何人来说都是可见的,但对于之后加入房间的用户来说则是隐藏的。",
|
||||
erase_admin_error: "不允许删除自己的用户",
|
||||
|
@@ -23,7 +23,6 @@ import {
|
||||
useTranslate,
|
||||
PasswordInput,
|
||||
TextInput,
|
||||
SelectInput,
|
||||
useLocales,
|
||||
} from "react-admin";
|
||||
import { useFormContext } from "react-hook-form";
|
||||
@@ -52,31 +51,16 @@ const LoginPage = () => {
|
||||
restrictBaseUrl.length > 0 &&
|
||||
restrictBaseUrl[0] !== "" &&
|
||||
restrictBaseUrl[0] !== null;
|
||||
const baseUrlChoices = allowMultipleBaseUrls ? restrictBaseUrl.map(url => ({ id: url, name: url })) : [];
|
||||
const allowAnyBaseUrl = !(allowSingleBaseUrl || allowMultipleBaseUrls);
|
||||
const localStorageBaseUrl = localStorage.getItem("base_url");
|
||||
let base_url = allowSingleBaseUrl ? restrictBaseUrl : localStorageBaseUrl;
|
||||
if (allowMultipleBaseUrls && localStorageBaseUrl && !restrictBaseUrl.includes(localStorageBaseUrl)) {
|
||||
// don't set base_url if it is not in the restrictBaseUrl array
|
||||
base_url = null;
|
||||
}
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [supportPassAuth, setSupportPassAuth] = useState(true);
|
||||
const [locale, setLocale] = useLocaleState();
|
||||
const locales = useLocales();
|
||||
const translate = useTranslate();
|
||||
|
||||
const base_url = allowSingleBaseUrl ? restrictBaseUrl : localStorage.getItem("base_url");
|
||||
const [ssoBaseUrl, setSSOBaseUrl] = useState("");
|
||||
const loginToken = new URLSearchParams(window.location.search).get("loginToken");
|
||||
const [loginMethod, setLoginMethod] = useState<LoginMethod>("credentials");
|
||||
const [serverVersion, setServerVersion] = useState("");
|
||||
const [matrixVersions, setMatrixVersions] = useState("");
|
||||
|
||||
useEffect(() => {
|
||||
if (base_url) {
|
||||
checkServerInfo(base_url);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!loginToken) {
|
||||
@@ -149,75 +133,54 @@ const LoginPage = () => {
|
||||
window.location.href = ssoFullUrl;
|
||||
};
|
||||
|
||||
const checkServerInfo = async (url: string) => {
|
||||
if (!isValidBaseUrl(url)) {
|
||||
setServerVersion("");
|
||||
setMatrixVersions("");
|
||||
setSupportPassAuth(false);
|
||||
setSSOBaseUrl("");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const serverVersion = await getServerVersion(url);
|
||||
setServerVersion(`${translate("synapseadmin.auth.server_version")} ${serverVersion}`);
|
||||
} catch (error) {
|
||||
setServerVersion("");
|
||||
}
|
||||
|
||||
try {
|
||||
const features = await getSupportedFeatures(url);
|
||||
setMatrixVersions(`${translate("synapseadmin.auth.supports_specs")} ${features.versions.join(", ")}`);
|
||||
} catch (error) {
|
||||
setMatrixVersions("");
|
||||
}
|
||||
|
||||
// Set SSO Url
|
||||
try {
|
||||
const loginFlows = await getSupportedLoginFlows(url);
|
||||
const supportPass = loginFlows.find(f => f.type === "m.login.password") !== undefined;
|
||||
const supportSSO = loginFlows.find(f => f.type === "m.login.sso") !== undefined;
|
||||
setSupportPassAuth(supportPass);
|
||||
setSSOBaseUrl(supportSSO ? url : "");
|
||||
} catch (error) {
|
||||
setSupportPassAuth(false);
|
||||
setSSOBaseUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
const UserData = ({ formData }) => {
|
||||
const form = useFormContext();
|
||||
const [serverVersion, setServerVersion] = useState("");
|
||||
const [matrixVersions, setMatrixVersions] = useState("");
|
||||
|
||||
const handleUsernameChange = async () => {
|
||||
const handleUsernameChange = () => {
|
||||
if (formData.base_url || allowSingleBaseUrl) {
|
||||
return;
|
||||
}
|
||||
// check if username is a full qualified userId then set base_url accordingly
|
||||
const domain = splitMxid(formData.username)?.domain;
|
||||
if (domain) {
|
||||
const url = await getWellKnownUrl(domain);
|
||||
if (allowAnyBaseUrl || (allowMultipleBaseUrls && restrictBaseUrl.includes(url))) {
|
||||
form.setValue("base_url", url, {
|
||||
shouldValidate: true,
|
||||
shouldDirty: true,
|
||||
});
|
||||
checkServerInfo(url);
|
||||
}
|
||||
getWellKnownUrl(domain).then(url => {
|
||||
if (allowAnyBaseUrl || (allowMultipleBaseUrls && restrictBaseUrl.includes(url)))
|
||||
form.setValue("base_url", url);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const handleBaseUrlBlurOrChange = event => {
|
||||
// Get the value either from the event (onChange) or from formData (onBlur)
|
||||
const value = event?.target?.value || formData.base_url;
|
||||
|
||||
if (!value) {
|
||||
return;
|
||||
useEffect(() => {
|
||||
if (!formData.base_url) {
|
||||
form.setValue("base_url", "");
|
||||
}
|
||||
if (formData.base_url === "" && allowMultipleBaseUrls) {
|
||||
form.setValue("base_url", restrictBaseUrl[0]);
|
||||
}
|
||||
if (!isValidBaseUrl(formData.base_url)) return;
|
||||
|
||||
// Trigger validation only when user finishes typing/selecting
|
||||
form.trigger("base_url");
|
||||
checkServerInfo(value);
|
||||
};
|
||||
getServerVersion(formData.base_url)
|
||||
.then(serverVersion => setServerVersion(`${translate("synapseadmin.auth.server_version")} ${serverVersion}`))
|
||||
.catch(() => setServerVersion(""));
|
||||
|
||||
getSupportedFeatures(formData.base_url)
|
||||
.then(features =>
|
||||
setMatrixVersions(`${translate("synapseadmin.auth.supports_specs")} ${features.versions.join(", ")}`)
|
||||
)
|
||||
.catch(() => setMatrixVersions(""));
|
||||
|
||||
// Set SSO Url
|
||||
getSupportedLoginFlows(formData.base_url)
|
||||
.then(loginFlows => {
|
||||
const supportPass = loginFlows.find(f => f.type === "m.login.password") !== undefined;
|
||||
const supportSSO = loginFlows.find(f => f.type === "m.login.sso") !== undefined;
|
||||
setSupportPassAuth(supportPass);
|
||||
setSSOBaseUrl(supportSSO ? formData.base_url : "");
|
||||
})
|
||||
.catch(() => setSSOBaseUrl(""));
|
||||
}, [formData.base_url, form]);
|
||||
|
||||
useEffect(() => {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
@@ -226,7 +189,6 @@ const LoginPage = () => {
|
||||
const password = params.get("password");
|
||||
const accessToken = params.get("accessToken");
|
||||
let serverURL = params.get("server");
|
||||
|
||||
if (username) {
|
||||
form.setValue("username", username);
|
||||
}
|
||||
@@ -240,19 +202,12 @@ const LoginPage = () => {
|
||||
form.setValue("accessToken", accessToken);
|
||||
}
|
||||
}
|
||||
|
||||
if (serverURL) {
|
||||
const isFullUrl = serverURL.match(/^(http|https):\/\//);
|
||||
if (!isFullUrl) {
|
||||
serverURL = `https://${serverURL}`;
|
||||
}
|
||||
|
||||
form.setValue("base_url", serverURL, {
|
||||
shouldValidate: true,
|
||||
shouldDirty: true,
|
||||
});
|
||||
|
||||
checkServerInfo(serverURL);
|
||||
form.setValue("base_url", serverURL);
|
||||
}
|
||||
}, [window.location.search]);
|
||||
|
||||
@@ -272,6 +227,7 @@ const LoginPage = () => {
|
||||
<>
|
||||
<Box>
|
||||
<TextInput
|
||||
autoFocus
|
||||
source="username"
|
||||
label="ra.auth.username"
|
||||
autoComplete="username"
|
||||
@@ -305,30 +261,23 @@ const LoginPage = () => {
|
||||
</Box>
|
||||
)}
|
||||
<Box>
|
||||
{allowMultipleBaseUrls && (
|
||||
<SelectInput
|
||||
source="base_url"
|
||||
label="synapseadmin.auth.base_url"
|
||||
select={allowMultipleBaseUrls}
|
||||
autoComplete="url"
|
||||
{...(loading ? { disabled: true } : {})}
|
||||
onChange={handleBaseUrlBlurOrChange}
|
||||
validate={[required(), validateBaseUrl]}
|
||||
choices={baseUrlChoices}
|
||||
/>
|
||||
)}
|
||||
{!allowMultipleBaseUrls && (
|
||||
<TextInput
|
||||
source="base_url"
|
||||
label="synapseadmin.auth.base_url"
|
||||
autoComplete="url"
|
||||
{...(loading ? { disabled: true } : {})}
|
||||
readOnly={allowSingleBaseUrl}
|
||||
resettable={allowAnyBaseUrl}
|
||||
validate={[required(), validateBaseUrl]}
|
||||
onBlur={handleBaseUrlBlurOrChange}
|
||||
/>
|
||||
)}
|
||||
<TextInput
|
||||
source="base_url"
|
||||
label="synapseadmin.auth.base_url"
|
||||
select={allowMultipleBaseUrls}
|
||||
autoComplete="url"
|
||||
{...(loading ? { disabled: true } : {})}
|
||||
readOnly={allowSingleBaseUrl}
|
||||
resettable={allowAnyBaseUrl}
|
||||
validate={[required(), validateBaseUrl]}
|
||||
>
|
||||
{allowMultipleBaseUrls &&
|
||||
restrictBaseUrl.map(url => (
|
||||
<MenuItem key={url} value={url}>
|
||||
{url}
|
||||
</MenuItem>
|
||||
))}
|
||||
</TextInput>
|
||||
</Box>
|
||||
<Typography className="serverVersion">{serverVersion}</Typography>
|
||||
<Typography className="matrixVersions">{matrixVersions}</Typography>
|
||||
@@ -337,7 +286,7 @@ const LoginPage = () => {
|
||||
};
|
||||
|
||||
return (
|
||||
<Form defaultValues={{ base_url: base_url }} onSubmit={handleSubmit} mode="onBlur">
|
||||
<Form defaultValues={{ base_url: base_url }} onSubmit={handleSubmit} mode="onTouched">
|
||||
<LoginFormBox>
|
||||
<Card className="card">
|
||||
<Box className="avatar">
|
||||
|
@@ -115,8 +115,7 @@ const userFilters = [
|
||||
<BooleanInput source="guests" alwaysOn />,
|
||||
<BooleanInput label="resources.users.fields.show_deactivated" source="deactivated" alwaysOn />,
|
||||
<BooleanInput label="resources.users.fields.show_locked" source="locked" alwaysOn />,
|
||||
// waiting for https://github.com/element-hq/synapse/issues/18016
|
||||
// <BooleanInput label="resources.users.fields.show_suspended" source="suspended" alwaysOn />,
|
||||
<BooleanInput label="resources.users.fields.show_suspended" source="suspended" alwaysOn />,
|
||||
];
|
||||
|
||||
const UserPreventSelfDelete: React.FC<{
|
||||
@@ -209,6 +208,7 @@ export const UserList = (props: ListProps) => (
|
||||
<BooleanField source="admin" label="resources.users.fields.admin" />
|
||||
<BooleanField source="deactivated" label="resources.users.fields.deactivated" />
|
||||
<BooleanField source="locked" label="resources.users.fields.locked" />
|
||||
<BooleanField source="suspended" label="resources.users.fields.suspended" />
|
||||
<BooleanField source="erased" sortable={false} label="resources.users.fields.erased" />
|
||||
<DateField source="creation_ts" label="resources.users.fields.creation_ts_ms" showTime options={DATE_FORMAT} />
|
||||
</DatagridConfigurable>
|
||||
@@ -426,7 +426,7 @@ const UserBooleanInput = props => {
|
||||
|
||||
return (
|
||||
<UserPreventSelfDelete ownUserIsSelected={ownUserIsSelected} asManagedUserIsSelected={asManagedUserIsSelected}>
|
||||
<BooleanInput disabled={ownUserIsSelected || asManagedUserIsSelected} {...props} />
|
||||
<BooleanInput {...props} disabled={ownUserIsSelected || asManagedUserIsSelected} />
|
||||
</UserPreventSelfDelete>
|
||||
);
|
||||
};
|
||||
@@ -434,7 +434,6 @@ const UserBooleanInput = props => {
|
||||
const UserPasswordInput = props => {
|
||||
const record = useRecordContext();
|
||||
let asManagedUserIsSelected = false;
|
||||
const translate = useTranslate();
|
||||
|
||||
// Get form context to update field value
|
||||
const form = useFormContext();
|
||||
@@ -447,34 +446,17 @@ const UserPasswordInput = props => {
|
||||
form.setValue("password", password, { shouldDirty: true });
|
||||
};
|
||||
|
||||
// Get the current deactivated state and the original value
|
||||
const deactivated = form.watch("deactivated");
|
||||
const deactivatedFromRecord = record?.deactivated;
|
||||
|
||||
// Custom validation for reactivation case
|
||||
const validatePasswordOnReactivation = value => {
|
||||
if (deactivatedFromRecord === true && deactivated === false && !value) {
|
||||
return translate("resources.users.helper.password_required_for_reactivation");
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
let passwordHelperText = "resources.users.helper.create_password";
|
||||
|
||||
if (asManagedUserIsSelected) {
|
||||
passwordHelperText = "resources.users.helper.modify_managed_user_error";
|
||||
} else if (deactivatedFromRecord === true && deactivated === false) {
|
||||
passwordHelperText = "resources.users.helper.password_required_for_reactivation";
|
||||
} else if (record) {
|
||||
passwordHelperText = "resources.users.helper.password";
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<PasswordInput
|
||||
{...props}
|
||||
validate={validatePasswordOnReactivation}
|
||||
helperText={passwordHelperText}
|
||||
helperText={
|
||||
asManagedUserIsSelected
|
||||
? "resources.users.helper.modify_managed_user_error"
|
||||
: record
|
||||
? "resources.users.helper.password"
|
||||
: "resources.users.helper.create_password"
|
||||
}
|
||||
disabled={asManagedUserIsSelected}
|
||||
/>
|
||||
<Button
|
||||
@@ -488,28 +470,8 @@ const UserPasswordInput = props => {
|
||||
);
|
||||
};
|
||||
|
||||
const ErasedBooleanInput = props => {
|
||||
const record = useRecordContext();
|
||||
const form = useFormContext();
|
||||
const deactivated = form.watch("deactivated");
|
||||
const erased = form.watch("erased");
|
||||
|
||||
const erasedFromRecord = record?.erased;
|
||||
const deactivatedFromRecord = record?.deactivated;
|
||||
|
||||
useEffect(() => {
|
||||
// If the user was erased and deactivated, by unchecking Erased, we want to also uncheck Deactivated
|
||||
if (erasedFromRecord === true && erased === false) {
|
||||
form.setValue("deactivated", false);
|
||||
}
|
||||
}, [deactivatedFromRecord, erased, erasedFromRecord]);
|
||||
|
||||
return <UserBooleanInput disabled={!deactivated} {...props} />;
|
||||
};
|
||||
|
||||
export const UserEdit = (props: EditProps) => {
|
||||
const translate = useTranslate();
|
||||
const theme = useTheme();
|
||||
|
||||
return (
|
||||
<Edit
|
||||
@@ -553,24 +515,12 @@ export const UserEdit = (props: EditProps) => {
|
||||
helperText="resources.users.helper.password"
|
||||
/>
|
||||
<SelectInput source="user_type" choices={choices_type} translateChoice={false} resettable />
|
||||
<BooleanInput source="admin" helperText="resources.users.helper.admin" />
|
||||
<BooleanInput source="admin" />
|
||||
<UserBooleanInput source="locked" />
|
||||
<UserBooleanInput source="deactivated" helperText="resources.users.helper.deactivate" />
|
||||
<UserBooleanInput source="suspended" helperText="resources.users.helper.suspend" />
|
||||
<UserBooleanInput
|
||||
sx={{ color: theme.palette.warning.main }}
|
||||
source="locked"
|
||||
helperText="resources.users.helper.lock"
|
||||
/>
|
||||
<UserBooleanInput
|
||||
sx={{ color: theme.palette.error.main }}
|
||||
source="deactivated"
|
||||
helperText="resources.users.helper.deactivate"
|
||||
/>
|
||||
<ErasedBooleanInput
|
||||
sx={{ color: theme.palette.error.main, marginLeft: "25px" }}
|
||||
source="erased"
|
||||
helperText="resources.users.helper.erase"
|
||||
/>
|
||||
<DateField sx={{ marginTop: "20px" }} source="creation_ts_ms" showTime options={DATE_FORMAT} />
|
||||
<BooleanInput source="erased" disabled />
|
||||
<DateField source="creation_ts_ms" showTime options={DATE_FORMAT} />
|
||||
<TextField source="consent_version" />
|
||||
</FormTab>
|
||||
|
||||
|
@@ -348,11 +348,6 @@ export interface SynapseDataProvider extends DataProvider {
|
||||
getAccountData: (id: Identifier) => Promise<AccountDataModel>;
|
||||
checkUsernameAvailability: (username: string) => Promise<UsernameAvailabilityResult>;
|
||||
makeRoomAdmin: (room_id: string, user_id: string) => Promise<{ success: boolean; error?: string; errcode?: string }>;
|
||||
suspendUser: (
|
||||
id: Identifier,
|
||||
suspendValue: boolean
|
||||
) => Promise<{ success: boolean; error?: string; errcode?: string }>;
|
||||
eraseUser: (id: Identifier) => Promise<{ success: boolean; error?: string; errcode?: string }>;
|
||||
getServerRunningProcess: (etkeAdminUrl: string) => Promise<ServerProcessResponse>;
|
||||
getServerStatus: (etkeAdminUrl: string) => Promise<ServerStatusResponse>;
|
||||
getServerNotifications: (etkeAdminUrl: string) => Promise<ServerNotificationsResponse>;
|
||||
@@ -787,7 +782,6 @@ const baseDataProvider: SynapseDataProvider = {
|
||||
const res = resourceMap[resource];
|
||||
|
||||
const endpoint_url = homeserver + res.path;
|
||||
|
||||
const { json } = await jsonClient(`${endpoint_url}/${encodeURIComponent(params.id)}`, {
|
||||
method: "PUT",
|
||||
body: JSON.stringify(params.data, filterNullValues),
|
||||
@@ -1032,38 +1026,6 @@ const baseDataProvider: SynapseDataProvider = {
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
suspendUser: async (id: Identifier, suspendValue: boolean) => {
|
||||
const base_url = localStorage.getItem("base_url");
|
||||
const endpoint_url = `${base_url}/_synapse/admin/v1/suspend/${encodeURIComponent(returnMXID(id))}`;
|
||||
try {
|
||||
const { json } = await jsonClient(endpoint_url, {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({ suspend: suspendValue }),
|
||||
});
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
if (error instanceof HttpError) {
|
||||
return { success: false, error: error.body.error, errcode: error.body.errcode };
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
eraseUser: async (id: Identifier) => {
|
||||
const base_url = localStorage.getItem("base_url");
|
||||
const endpoint_url = `${base_url}/_synapse/admin/v1/deactivate/${encodeURIComponent(returnMXID(id))}`;
|
||||
try {
|
||||
await jsonClient(endpoint_url, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ erase: true }),
|
||||
});
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
if (error instanceof HttpError) {
|
||||
return { success: false, error: error.body.error, errcode: error.body.errcode };
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
getServerRunningProcess: async (etkeAdminUrl: string, burstCache = false): Promise<ServerProcessResponse> => {
|
||||
const locked_at = "";
|
||||
const command = "";
|
||||
@@ -1465,39 +1427,24 @@ const dataProvider = withLifecycleCallbacks(baseDataProvider, [
|
||||
const avatarFile = params.data.avatar_file?.rawFile;
|
||||
const avatarErase = params.data.avatar_erase;
|
||||
const rates = params.data.rates;
|
||||
const suspended = params.data.suspended;
|
||||
const previousSuspended = params.previousData?.suspended;
|
||||
const deactivated = params.data.deactivated;
|
||||
const erased = params.data.erased;
|
||||
|
||||
if (rates) {
|
||||
await dataProvider.setRateLimits(params.id, rates);
|
||||
delete params.data.rates;
|
||||
}
|
||||
|
||||
if (suspended !== undefined && suspended !== previousSuspended) {
|
||||
await (dataProvider as SynapseDataProvider).suspendUser(params.id, suspended);
|
||||
delete params.data.suspended;
|
||||
}
|
||||
|
||||
if (deactivated !== undefined && erased !== undefined) {
|
||||
await (dataProvider as SynapseDataProvider).eraseUser(params.id);
|
||||
delete params.data.deactivated;
|
||||
delete params.data.erased;
|
||||
}
|
||||
|
||||
if (avatarErase) {
|
||||
params.data.avatar_url = "";
|
||||
return params;
|
||||
}
|
||||
|
||||
if (avatarFile instanceof File) {
|
||||
const response = await dataProvider.uploadMedia({
|
||||
const reponse = await dataProvider.uploadMedia({
|
||||
file: avatarFile,
|
||||
filename: params.data.avatar_file.title,
|
||||
content_type: params.data.avatar_file.rawFile.type,
|
||||
});
|
||||
params.data.avatar_url = response.content_uri;
|
||||
params.data.avatar_url = reponse.content_uri;
|
||||
}
|
||||
return params;
|
||||
},
|
||||
|
@@ -67,7 +67,7 @@ export const FetchConfig = async () => {
|
||||
};
|
||||
|
||||
// load config from context
|
||||
// we deliberately processing each key separately to avoid overwriting the whole config, losing some keys, and messing
|
||||
// we deliberately processing each key separately to avoid overwriting the whole config, loosing some keys, and messing
|
||||
// with typescript types
|
||||
export const LoadConfig = (context: any) => {
|
||||
if (context?.restrictBaseUrl) {
|
||||
|
@@ -2,7 +2,7 @@ export const getServerAndMediaIdFromMxcUrl = (mxcUrl: string): { serverName: str
|
||||
const re = /^mxc:\/\/([^/]+)\/([\w-]+)$/;
|
||||
const ret = re.exec(mxcUrl);
|
||||
if (ret == null) {
|
||||
return { serverName: "", mediaId: "" };
|
||||
throw new Error("Invalid mxcUrl");
|
||||
}
|
||||
const serverName = ret[1];
|
||||
const mediaId = ret[2];
|
||||
@@ -17,8 +17,7 @@ export const fetchAuthenticatedMedia = async (mxcUrl: string, type: MediaType):
|
||||
|
||||
const { serverName, mediaId } = getServerAndMediaIdFromMxcUrl(mxcUrl);
|
||||
if (!serverName || !mediaId) {
|
||||
console.error("Invalid mxcUrl", mxcUrl, "serverName:", serverName, "mediaId:", mediaId);
|
||||
return new Response(null, { status: 400, statusText: "Invalid mxcUrl" });
|
||||
throw new Error("Invalid mxcUrl");
|
||||
}
|
||||
|
||||
let url = "";
|
||||
|
521
yarn.lock
521
yarn.lock
@@ -257,7 +257,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.25.9"
|
||||
|
||||
"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.8", "@babel/runtime@^7.27.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7":
|
||||
"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.8", "@babel/runtime@^7.26.0", "@babel/runtime@^7.27.0", "@babel/runtime@^7.27.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7":
|
||||
version "7.27.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.1.tgz#9fce313d12c9a77507f264de74626e87fd0dc541"
|
||||
integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==
|
||||
@@ -584,10 +584,10 @@
|
||||
minimatch "^3.1.2"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@eslint/js@9.28.0", "@eslint/js@^9.25.0":
|
||||
version "9.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.28.0.tgz#7822ccc2f8cae7c3cd4f902377d520e9ae03f844"
|
||||
integrity sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==
|
||||
"@eslint/js@9.27.0", "@eslint/js@^9.25.0":
|
||||
version "9.27.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.27.0.tgz#181a23460877c484f6dd03890f4e3fa2fdeb8ff0"
|
||||
integrity sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==
|
||||
|
||||
"@eslint/object-schema@^2.1.6":
|
||||
version "2.1.6"
|
||||
@@ -894,28 +894,40 @@
|
||||
"@jridgewell/resolve-uri" "^3.1.0"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||
|
||||
"@mui/core-downloads-tracker@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-7.1.1.tgz#43532ccf57be19055eb20e7802508520293cf286"
|
||||
integrity sha512-yBckQs4aQ8mqukLnPC6ivIRv6guhaXi8snVl00VtyojBbm+l6VbVhyTSZ68Abcx7Ah8B+GZhrB7BOli+e+9LkQ==
|
||||
"@mui/core-downloads-tracker@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.11.tgz#0752eea024d8ff0f120b0f26aee4342c79112847"
|
||||
integrity sha512-CzAQs9CTzlwbsF9ZYB4o4lLwBv1/qNE264NjuYao+ctAXsmlPtYa8RtER4UsUXSMxNN9Qi+aQdYcKl2sUpnmAw==
|
||||
|
||||
"@mui/icons-material@^5.16.12 || ^6.0.0 || ^7.0.0", "@mui/icons-material@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-7.1.1.tgz#0e0e9640579da5e4096f0449438337c448bc5a5c"
|
||||
integrity sha512-X37+Yc8QpEnl0sYmz+WcLFy2dWgNRzbswDzLPXG7QU1XDVlP5TPp1HXjdmCupOWLL/I9m1fyhcyZl8/HPpp/Cg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/core-downloads-tracker@^7.0.2":
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.2.tgz#2e6dcaf5027a3957d37797b8dce5c15c78fd4b82"
|
||||
integrity sha512-TfeFU9TgN1N06hyb/pV/63FfO34nijZRMqgHk0TJ3gkl4Fbd+wZ73+ZtOd7jag6hMmzO9HSrBc6Vdn591nhkAg==
|
||||
|
||||
"@mui/material@^5.16.12 || ^6.0.0 || ^7.0.0", "@mui/material@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.1.1.tgz#5f75b25936925be14cb34abe0489cda82a6f8413"
|
||||
integrity sha512-mTpdmdZCaHCGOH3SrYM41+XKvNL0iQfM9KlYgpSjgadXx/fEKhhvOktxm8++Xw6FFeOHoOiV+lzOI8X1rsv71A==
|
||||
"@mui/icons-material@^5.16.12 || ^6.0.0 || ^7.0.0":
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-7.0.2.tgz#34a564081238a065ec9c939b50646637816ba98d"
|
||||
integrity sha512-Bo57PFLOqXOqPNrXjd8AhzH5s6TCsNUQbvnQ0VKZ8D+lIlteqKnrk/O1luMJUc/BXONK7BfIdTdc7qOnXYbMdw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/core-downloads-tracker" "^7.1.1"
|
||||
"@mui/system" "^7.1.1"
|
||||
"@mui/types" "^7.4.3"
|
||||
"@mui/utils" "^7.1.1"
|
||||
"@babel/runtime" "^7.27.0"
|
||||
|
||||
"@mui/icons-material@^6.4.8":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.4.11.tgz#add406d3d1c82e7aaf49002a8d456fa992e7f3db"
|
||||
integrity sha512-+jjJGIrB1awNbMv4ZVPPdN/p7O1UKFZ+xqRvNIQ8B1KnlID5hPMPBLM6UUbRF4bu3UDCbu79rn9Nye5LGNzmeA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
|
||||
"@mui/material@^5.16.12 || ^6.0.0 || ^7.0.0":
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.0.2.tgz#444de6ab1d0856b638f98833f536c80293c66005"
|
||||
integrity sha512-rjJlJ13+3LdLfobRplkXbjIFEIkn6LgpetgU/Cs3Xd8qINCCQK9qXQIjjQ6P0FXFTPFzEVMj0VgBR1mN+FhOcA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.0"
|
||||
"@mui/core-downloads-tracker" "^7.0.2"
|
||||
"@mui/system" "^7.0.2"
|
||||
"@mui/types" "^7.4.1"
|
||||
"@mui/utils" "^7.0.2"
|
||||
"@popperjs/core" "^2.11.8"
|
||||
"@types/react-transition-group" "^4.4.12"
|
||||
clsx "^2.1.1"
|
||||
@@ -924,55 +936,125 @@
|
||||
react-is "^19.1.0"
|
||||
react-transition-group "^4.4.5"
|
||||
|
||||
"@mui/private-theming@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.1.1.tgz#c2ecc57a9b97fbfdd850430de500c42a0f2571fe"
|
||||
integrity sha512-M8NbLUx+armk2ZuaxBkkMk11ultnWmrPlN0Xe3jUEaBChg/mcxa5HWIWS1EE4DF36WRACaAHVAvyekWlDQf0PQ==
|
||||
"@mui/material@^6.4.8":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.4.11.tgz#ac5c42c25fc807545eef4de0e88a47b52de8ed75"
|
||||
integrity sha512-k2D3FLJS+/qD0qnd6ZlAjGFvaaxe1Dl10NyvpeDzIebMuYdn8VqYe6XBgGueEAtnzSJM4V03VD9kb5Fi24dnTA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/utils" "^7.1.1"
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/core-downloads-tracker" "^6.4.11"
|
||||
"@mui/system" "^6.4.11"
|
||||
"@mui/types" "~7.2.24"
|
||||
"@mui/utils" "^6.4.9"
|
||||
"@popperjs/core" "^2.11.8"
|
||||
"@types/react-transition-group" "^4.4.12"
|
||||
clsx "^2.1.1"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
react-is "^19.0.0"
|
||||
react-transition-group "^4.4.5"
|
||||
|
||||
"@mui/private-theming@^6.4.9":
|
||||
version "6.4.9"
|
||||
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.4.9.tgz#0c1d65a638a1740aad0eb715d79e76471abe8175"
|
||||
integrity sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/utils" "^6.4.9"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/styled-engine@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.1.1.tgz#2524e0f4e22782b42ea4c32f36f9e19a50ccf55a"
|
||||
integrity sha512-R2wpzmSN127j26HrCPYVQ53vvMcT5DaKLoWkrfwUYq3cYytL6TQrCH8JBH3z79B6g4nMZZVoaXrxO757AlShaw==
|
||||
"@mui/private-theming@^7.0.2":
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.0.2.tgz#18bd6c464d5af854e37ac3947f411ac76467c249"
|
||||
integrity sha512-6lt8heDC9wN8YaRqEdhqnm0cFCv08AMf4IlttFvOVn7ZdKd81PNpD/rEtPGLLwQAFyyKSxBG4/2XCgpbcdNKiA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@babel/runtime" "^7.27.0"
|
||||
"@mui/utils" "^7.0.2"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/styled-engine@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.4.11.tgz#a48f48165382943018f70519de1d31e036abb054"
|
||||
integrity sha512-74AUmlHXaGNbyUqdK/+NwDJOZqgRQw6BcNvhoWYLq3LGbLTkE+khaJ7soz6cIabE4CPYqO2/QAIU1Z/HEjjpcw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@emotion/cache" "^11.13.5"
|
||||
"@emotion/serialize" "^1.3.3"
|
||||
"@emotion/sheet" "^1.4.0"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/system@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.1.1.tgz#eff52e597b0bfed8ecf2e973f4575ef737430727"
|
||||
integrity sha512-Kj1uhiqnj4Zo7PDjAOghtXJtNABunWvhcRU0O7RQJ7WOxeynoH6wXPcilphV8QTFtkKaip8EiNJRiCD+B3eROA==
|
||||
"@mui/styled-engine@^7.0.2":
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.0.2.tgz#7f13cd8b8cd793fbcd02fff5a8bee64069dc9265"
|
||||
integrity sha512-11Bt4YdHGlh7sB8P75S9mRCUxTlgv7HGbr0UKz6m6Z9KLeiw1Bm9y/t3iqLLVMvSHYB6zL8X8X+LmfTE++gyBw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/private-theming" "^7.1.1"
|
||||
"@mui/styled-engine" "^7.1.1"
|
||||
"@mui/types" "^7.4.3"
|
||||
"@mui/utils" "^7.1.1"
|
||||
"@babel/runtime" "^7.27.0"
|
||||
"@emotion/cache" "^11.13.5"
|
||||
"@emotion/serialize" "^1.3.3"
|
||||
"@emotion/sheet" "^1.4.0"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/system@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.4.11.tgz#f209e0792d008be2f75af41fada2ee9e06adeef2"
|
||||
integrity sha512-gibtsrZEwnDaT5+I/KloOj/yHluX5G8heknuxBpQOdEQ3Gc0avjSImn5hSeKp8D4thiwZiApuggIjZw1dQguUA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/private-theming" "^6.4.9"
|
||||
"@mui/styled-engine" "^6.4.11"
|
||||
"@mui/types" "~7.2.24"
|
||||
"@mui/utils" "^6.4.9"
|
||||
clsx "^2.1.1"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/types@^7.4.3":
|
||||
version "7.4.3"
|
||||
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.3.tgz#b205ee3404db0478cd93227fc21967e2cb8630fe"
|
||||
integrity sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==
|
||||
"@mui/system@^7.0.2":
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.0.2.tgz#e03222375f486d697a4817865a81a1ac7d88f4d2"
|
||||
integrity sha512-yFUraAWYWuKIISPPEVPSQ1NLeqmTT4qiQ+ktmyS8LO/KwHxB+NNVOacEZaIofh5x1NxY8rzphvU5X2heRZ/RDA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.0"
|
||||
"@mui/private-theming" "^7.0.2"
|
||||
"@mui/styled-engine" "^7.0.2"
|
||||
"@mui/types" "^7.4.1"
|
||||
"@mui/utils" "^7.0.2"
|
||||
clsx "^2.1.1"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/types@^7.4.1", "@mui/types@^7.4.2":
|
||||
version "7.4.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.2.tgz#fdeb9855a4968c360bcc998b9dba93e5f635b40f"
|
||||
integrity sha512-edRc5JcLPsrlNFYyTPxds+d5oUovuUxnnDtpJUbP6WMeV4+6eaX/mqai1ZIWT62lCOe0nlrON0s9HDiv5en5bA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.1"
|
||||
|
||||
"@mui/utils@^7.1.0", "@mui/utils@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.1.1.tgz#de315ec45ac9e16c637dcc2b32cd7912edb4e234"
|
||||
integrity sha512-BkOt2q7MBYl7pweY2JWwfrlahhp+uGLR8S+EhiyRaofeRYUWL2YKbSGQvN4hgSN1i8poN0PaUiii1kEMrchvzg==
|
||||
"@mui/types@~7.2.24":
|
||||
version "7.2.24"
|
||||
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.24.tgz#5eff63129d9c29d80bbf2d2e561bd0690314dec2"
|
||||
integrity sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==
|
||||
|
||||
"@mui/utils@^6.4.9":
|
||||
version "6.4.9"
|
||||
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.4.9.tgz#b0df01daa254c7c32a1a30b30a5179e19ef071a7"
|
||||
integrity sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/types" "~7.2.24"
|
||||
"@types/prop-types" "^15.7.14"
|
||||
clsx "^2.1.1"
|
||||
prop-types "^15.8.1"
|
||||
react-is "^19.0.0"
|
||||
|
||||
"@mui/utils@^7.0.2", "@mui/utils@^7.1.0":
|
||||
version "7.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.1.0.tgz#464c0c1bc8f57c07d934ac674f3dcc81ac24f68b"
|
||||
integrity sha512-/OM3S8kSHHmWNOP+NH9xEtpYSG10upXeQ0wLZnfDgmgadTAk5F4MQfFLyZ5FCRJENB3eRzltMmaNl6UtDnPovw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/types" "^7.4.3"
|
||||
"@mui/types" "^7.4.2"
|
||||
"@types/prop-types" "^15.7.14"
|
||||
clsx "^2.1.1"
|
||||
prop-types "^15.8.1"
|
||||
@@ -999,21 +1081,16 @@
|
||||
"@nodelib/fs.scandir" "2.1.5"
|
||||
fastq "^1.6.0"
|
||||
|
||||
"@pkgr/core@^0.2.4":
|
||||
version "0.2.7"
|
||||
resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.7.tgz#eb5014dfd0b03e7f3ba2eeeff506eed89b028058"
|
||||
integrity sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==
|
||||
"@pkgr/core@^0.2.3":
|
||||
version "0.2.4"
|
||||
resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.4.tgz#d897170a2b0ba51f78a099edccd968f7b103387c"
|
||||
integrity sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==
|
||||
|
||||
"@popperjs/core@^2.11.8":
|
||||
version "2.11.8"
|
||||
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
|
||||
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
|
||||
|
||||
"@rolldown/pluginutils@1.0.0-beta.9":
|
||||
version "1.0.0-beta.9"
|
||||
resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz#68ef9fff5a9791a642cea0dc4380ce6cb487a84a"
|
||||
integrity sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==
|
||||
|
||||
"@rollup/rollup-android-arm-eabi@4.40.0":
|
||||
version "4.40.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3"
|
||||
@@ -1138,17 +1215,17 @@
|
||||
dependencies:
|
||||
"@sinonjs/commons" "^3.0.0"
|
||||
|
||||
"@tanstack/query-core@5.80.6":
|
||||
version "5.80.6"
|
||||
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.80.6.tgz#d2e54fa9eabebc953c675b74b17d6cd45a2a4cb4"
|
||||
integrity sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ==
|
||||
"@tanstack/query-core@5.76.0":
|
||||
version "5.76.0"
|
||||
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.76.0.tgz#3b4d5d34ce307ba0cf7d1a3e90d7adcdc6c46be0"
|
||||
integrity sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg==
|
||||
|
||||
"@tanstack/react-query@^5.21.7", "@tanstack/react-query@^5.80.6":
|
||||
version "5.80.6"
|
||||
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.80.6.tgz#9c77f05f3236b95693caaea155e5eaa4459f0197"
|
||||
integrity sha512-izX+5CnkpON3NQGcEm3/d7LfFQNo9ZpFtX2QsINgCYK9LT2VCIdi8D3bMaMSNhrAJCznRoAkFic76uvLroALBw==
|
||||
"@tanstack/react-query@^5.21.7", "@tanstack/react-query@^5.76.1":
|
||||
version "5.76.1"
|
||||
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.76.1.tgz#ac8a19f99dfec1452a44fe22d46680c396c21152"
|
||||
integrity sha512-YxdLZVGN4QkT5YT1HKZQWiIlcgauIXEIsMOTSjvyD5wLYK8YVvKZUPAysMqossFJJfDpJW3pFn7WNZuPOqq+fw==
|
||||
dependencies:
|
||||
"@tanstack/query-core" "5.80.6"
|
||||
"@tanstack/query-core" "5.76.0"
|
||||
|
||||
"@testing-library/dom@^10.0.0":
|
||||
version "10.4.0"
|
||||
@@ -1310,15 +1387,15 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
|
||||
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
|
||||
|
||||
"@types/lodash@^4.17.17":
|
||||
version "4.17.17"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.17.tgz#fb85a04f47e9e4da888384feead0de05f7070355"
|
||||
integrity sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==
|
||||
"@types/lodash@^4.17.16":
|
||||
version "4.17.16"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.16.tgz#94ae78fab4a38d73086e962d0b65c30d816bfb0a"
|
||||
integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==
|
||||
|
||||
"@types/node@*", "@types/node@^22.15.30":
|
||||
version "22.15.30"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.30.tgz#3a20431783e28dd0b0326f84ab386a2ec81d921d"
|
||||
integrity sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==
|
||||
"@types/node@*", "@types/node@^22.15.19":
|
||||
version "22.15.19"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.19.tgz#ba9f321675243af0456d607fa82a4865931e0cef"
|
||||
integrity sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==
|
||||
dependencies:
|
||||
undici-types "~6.21.0"
|
||||
|
||||
@@ -1344,10 +1421,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044"
|
||||
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
|
||||
|
||||
"@types/react@^19.1.6":
|
||||
version "19.1.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.6.tgz#dee39f3e1e9a7d693f156a5840570b6d57f325ea"
|
||||
integrity sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==
|
||||
"@types/react@^19.1.4":
|
||||
version "19.1.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.4.tgz#4d125f014d6ac26b4759775698db118701e314fe"
|
||||
integrity sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==
|
||||
dependencies:
|
||||
csstype "^3.0.2"
|
||||
|
||||
@@ -1378,78 +1455,62 @@
|
||||
dependencies:
|
||||
"@types/yargs-parser" "*"
|
||||
|
||||
"@typescript-eslint/eslint-plugin@8.33.1", "@typescript-eslint/eslint-plugin@^8.32.0":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz#532641b416ed2afd5be893cddb2a58e9cd1f7a3e"
|
||||
integrity sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==
|
||||
"@typescript-eslint/eslint-plugin@8.32.1", "@typescript-eslint/eslint-plugin@^8.32.0":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz#9185b3eaa3b083d8318910e12d56c68b3c4f45b4"
|
||||
integrity sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==
|
||||
dependencies:
|
||||
"@eslint-community/regexpp" "^4.10.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/type-utils" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.32.1"
|
||||
"@typescript-eslint/type-utils" "8.32.1"
|
||||
"@typescript-eslint/utils" "8.32.1"
|
||||
"@typescript-eslint/visitor-keys" "8.32.1"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^7.0.0"
|
||||
natural-compare "^1.4.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/parser@8.33.1", "@typescript-eslint/parser@^8.32.0":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.1.tgz#ef9a5ee6aa37a6b4f46cc36d08a14f828238afe2"
|
||||
integrity sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==
|
||||
"@typescript-eslint/parser@8.32.1", "@typescript-eslint/parser@^8.32.0":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.32.1.tgz#18b0e53315e0bc22b2619d398ae49a968370935e"
|
||||
integrity sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.32.1"
|
||||
"@typescript-eslint/types" "8.32.1"
|
||||
"@typescript-eslint/typescript-estree" "8.32.1"
|
||||
"@typescript-eslint/visitor-keys" "8.32.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/project-service@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.1.tgz#c85e7d9a44d6a11fe64e73ac1ed47de55dc2bf9f"
|
||||
integrity sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==
|
||||
"@typescript-eslint/scope-manager@8.32.1":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz#9a6bf5fb2c5380e14fe9d38ccac6e4bbe17e8afc"
|
||||
integrity sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==
|
||||
dependencies:
|
||||
"@typescript-eslint/tsconfig-utils" "^8.33.1"
|
||||
"@typescript-eslint/types" "^8.33.1"
|
||||
debug "^4.3.4"
|
||||
"@typescript-eslint/types" "8.32.1"
|
||||
"@typescript-eslint/visitor-keys" "8.32.1"
|
||||
|
||||
"@typescript-eslint/scope-manager@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz#d1e0efb296da5097d054bc9972e69878a2afea73"
|
||||
integrity sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==
|
||||
"@typescript-eslint/type-utils@8.32.1":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz#b9292a45f69ecdb7db74d1696e57d1a89514d21e"
|
||||
integrity sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
|
||||
"@typescript-eslint/tsconfig-utils@8.33.1", "@typescript-eslint/tsconfig-utils@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz#7836afcc097a4657a5ed56670851a450d8b70ab8"
|
||||
integrity sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==
|
||||
|
||||
"@typescript-eslint/type-utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz#d73ee1a29d8a0abe60d4abbff4f1d040f0de15fa"
|
||||
integrity sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==
|
||||
dependencies:
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.32.1"
|
||||
"@typescript-eslint/utils" "8.32.1"
|
||||
debug "^4.3.4"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/types@8.33.1", "@typescript-eslint/types@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.1.tgz#b693111bc2180f8098b68e9958cf63761657a55f"
|
||||
integrity sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==
|
||||
"@typescript-eslint/types@8.32.1":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.32.1.tgz#b19fe4ac0dc08317bae0ce9ec1168123576c1d4b"
|
||||
integrity sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==
|
||||
|
||||
"@typescript-eslint/typescript-estree@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz#d271beed470bc915b8764e22365d4925c2ea265d"
|
||||
integrity sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==
|
||||
"@typescript-eslint/typescript-estree@8.32.1":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz#9023720ca4ecf4f59c275a05b5fed69b1276face"
|
||||
integrity sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==
|
||||
dependencies:
|
||||
"@typescript-eslint/project-service" "8.33.1"
|
||||
"@typescript-eslint/tsconfig-utils" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
"@typescript-eslint/types" "8.32.1"
|
||||
"@typescript-eslint/visitor-keys" "8.32.1"
|
||||
debug "^4.3.4"
|
||||
fast-glob "^3.3.2"
|
||||
is-glob "^4.0.3"
|
||||
@@ -1457,33 +1518,32 @@
|
||||
semver "^7.6.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.1.tgz#ea22f40d3553da090f928cf17907e963643d4b96"
|
||||
integrity sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==
|
||||
"@typescript-eslint/utils@8.32.1":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.32.1.tgz#4d6d5d29b9e519e9a85e9a74e9f7bdb58abe9704"
|
||||
integrity sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.7.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/scope-manager" "8.32.1"
|
||||
"@typescript-eslint/types" "8.32.1"
|
||||
"@typescript-eslint/typescript-estree" "8.32.1"
|
||||
|
||||
"@typescript-eslint/visitor-keys@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz#6c6e002c24d13211df3df851767f24dfdb4f42bc"
|
||||
integrity sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==
|
||||
"@typescript-eslint/visitor-keys@8.32.1":
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz#4321395cc55c2eb46036cbbb03e101994d11ddca"
|
||||
integrity sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/types" "8.32.1"
|
||||
eslint-visitor-keys "^4.2.0"
|
||||
|
||||
"@vitejs/plugin-react@^4.5.1":
|
||||
version "4.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.5.1.tgz#19432712467ad3b81f24c85d695a6febf8d4cc11"
|
||||
integrity sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==
|
||||
"@vitejs/plugin-react@^4.4.1":
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz#d7d1e9c9616d7536b0953637edfee7c6cbe2fe0f"
|
||||
integrity sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==
|
||||
dependencies:
|
||||
"@babel/core" "^7.26.10"
|
||||
"@babel/plugin-transform-react-jsx-self" "^7.25.9"
|
||||
"@babel/plugin-transform-react-jsx-source" "^7.25.9"
|
||||
"@rolldown/pluginutils" "1.0.0-beta.9"
|
||||
"@types/babel__core" "^7.20.5"
|
||||
react-refresh "^0.17.0"
|
||||
|
||||
@@ -2530,13 +2590,13 @@ eslint-plugin-jsx-a11y@^6.10.2:
|
||||
safe-regex-test "^1.0.3"
|
||||
string.prototype.includes "^2.0.1"
|
||||
|
||||
eslint-plugin-prettier@^5.4.1:
|
||||
version "5.4.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz#99b55d7dd70047886b2222fdd853665f180b36af"
|
||||
integrity sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==
|
||||
eslint-plugin-prettier@^5.4.0:
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz#54d4748904e58eaf1ffe26c4bffa4986ca7f952b"
|
||||
integrity sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==
|
||||
dependencies:
|
||||
prettier-linter-helpers "^1.0.0"
|
||||
synckit "^0.11.7"
|
||||
synckit "^0.11.0"
|
||||
|
||||
eslint-plugin-unused-imports@^4.1.4:
|
||||
version "4.1.4"
|
||||
@@ -2561,10 +2621,10 @@ eslint-visitor-keys@^4.2.0:
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
|
||||
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
|
||||
|
||||
eslint@^9.28.0:
|
||||
version "9.28.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.28.0.tgz#b0bcbe82a16945a40906924bea75e8b4980ced7d"
|
||||
integrity sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==
|
||||
eslint@^9.27.0:
|
||||
version "9.27.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.27.0.tgz#a587d3cd5b844b68df7898944323a702afe38979"
|
||||
integrity sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.2.0"
|
||||
"@eslint-community/regexpp" "^4.12.1"
|
||||
@@ -2572,7 +2632,7 @@ eslint@^9.28.0:
|
||||
"@eslint/config-helpers" "^0.2.1"
|
||||
"@eslint/core" "^0.14.0"
|
||||
"@eslint/eslintrc" "^3.3.1"
|
||||
"@eslint/js" "9.28.0"
|
||||
"@eslint/js" "9.27.0"
|
||||
"@eslint/plugin-kit" "^0.3.1"
|
||||
"@humanfs/node" "^0.16.6"
|
||||
"@humanwhocodes/module-importer" "^1.0.1"
|
||||
@@ -4291,10 +4351,10 @@ p-try@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
|
||||
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
|
||||
|
||||
papaparse@^5.5.3:
|
||||
version "5.5.3"
|
||||
resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.5.3.tgz#07f8994dec516c6dab266e952bed68e1de59fa9a"
|
||||
integrity sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==
|
||||
papaparse@^5.5.1:
|
||||
version "5.5.2"
|
||||
resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.5.2.tgz#fb67cc5a03ba8930cb435dc4641a25d6804bd4d7"
|
||||
integrity sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==
|
||||
|
||||
parent-module@^1.0.0:
|
||||
version "1.0.1"
|
||||
@@ -4496,10 +4556,10 @@ ra-core@^4.11.2, ra-core@^4.16.2:
|
||||
react-is "^17.0.2"
|
||||
react-query "^3.32.1"
|
||||
|
||||
ra-core@^5.4.3, ra-core@^5.4.4, ra-core@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/ra-core/-/ra-core-5.8.3.tgz#be68513840bfb43c1f6d20612350aaf1ec08598a"
|
||||
integrity sha512-pMmZ9oQLh2cuZvRaYlJTnE2YVDSYuovINrzm9C2cbrPMajfwl/Eouq0bH+DmEo/oC8QI6SKVLkMTgqzaMa5IKw==
|
||||
ra-core@^5.4.3, ra-core@^5.4.4, ra-core@^5.8.2:
|
||||
version "5.8.2"
|
||||
resolved "https://registry.yarnpkg.com/ra-core/-/ra-core-5.8.2.tgz#bb81c26e51cd9bf9ba2e8e9a7768d1dbe19683de"
|
||||
integrity sha512-kcaV/3d6SbRYAl9UqCqqUXWDebtDCYGOjv/V2z/Z5ZO5LKFxYw1db3iTvvfPWlexPP/tbAAJf6stY2ZlqWyXKA==
|
||||
dependencies:
|
||||
"@tanstack/react-query" "^5.21.7"
|
||||
clsx "^2.1.1"
|
||||
@@ -4512,49 +4572,49 @@ ra-core@^5.4.3, ra-core@^5.4.4, ra-core@^5.8.3:
|
||||
react-error-boundary "^4.0.13"
|
||||
react-is "^18.2.0 || ^19.0.0"
|
||||
|
||||
ra-i18n-polyglot@^5.4.4, ra-i18n-polyglot@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/ra-i18n-polyglot/-/ra-i18n-polyglot-5.8.3.tgz#666b3cbd76c0e24a2c86c0b46c98821b409aed10"
|
||||
integrity sha512-euPOGDBnu4UK3Q9ZHTG2CwfZ3VNLT75b2357iDjz3UW1FTVwKacLhXUkghrTH/DSMLBH+zQqKun3SiWuVaCZgA==
|
||||
ra-i18n-polyglot@^5.4.4, ra-i18n-polyglot@^5.8.2:
|
||||
version "5.8.2"
|
||||
resolved "https://registry.yarnpkg.com/ra-i18n-polyglot/-/ra-i18n-polyglot-5.8.2.tgz#0ce967a5d4ae92da9c917aed5196dfe575ea28dd"
|
||||
integrity sha512-UobX2ZvvyKjVaD5j9M77rKC9Mh4x3Vka4u6t/JA9r/P42PlYYyUDjFDQ0fRYUPAvO/YMEQpQWpazCDXr0csh3w==
|
||||
dependencies:
|
||||
node-polyglot "^2.2.2"
|
||||
ra-core "^5.8.3"
|
||||
ra-core "^5.8.2"
|
||||
|
||||
ra-language-english@^5.4.4, ra-language-english@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-english/-/ra-language-english-5.8.3.tgz#0afc7e50e3c92716287dd75149e14dc877cca32a"
|
||||
integrity sha512-G9qQaiqbgs0jqvWQEPoazHRadacYvX0AN8uxZiZvvNo/RINQ1UCV75eXShrr1c7Wn4ldILqwXJqXjUGxldeDCw==
|
||||
ra-language-english@^5.4.4, ra-language-english@^5.8.2:
|
||||
version "5.8.2"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-english/-/ra-language-english-5.8.2.tgz#fe1121a73bf35bd5f4c21073222ef4b661ee439a"
|
||||
integrity sha512-Z2ta/XrN5Q4NtFkRpFxD4DAzrCgsSMM1YJ88r46vSeqr6/5X6OWMBI+xWYJG80elR57eSilPzNF6r6iMpIYx3Q==
|
||||
dependencies:
|
||||
ra-core "^5.8.3"
|
||||
ra-core "^5.8.2"
|
||||
|
||||
ra-language-farsi@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-farsi/-/ra-language-farsi-5.1.0.tgz#27d2cc50e4074a0e2565e05da153da0d213729f8"
|
||||
integrity sha512-U4swqsijT6foRP9v/fqLGEXV1TjuyjpQcmoDJfsN2kPyR9QiKlLGNrbv/sfpt7LT0om3egIXIRp/iQG1u44GXQ==
|
||||
|
||||
ra-language-french@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-french/-/ra-language-french-5.8.3.tgz#aed41d7b75f32788c662c1ff26d0e0d34b01c23b"
|
||||
integrity sha512-dtgopRO21Bt6Fuu+V4OC7UeV/PrXhyhqnEeMc9pnaC6AQAJKr+2piFdO6ED/L3VWLudz5a1yQfwW4cscUWzXoA==
|
||||
ra-language-french@^5.8.2:
|
||||
version "5.8.2"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-french/-/ra-language-french-5.8.2.tgz#b45e1b6d24d33e26fd9beb0d64de290e5f297bce"
|
||||
integrity sha512-3PI/j33fKONXHIScXxg5JT57cuwTK25C9Lu4qIbFeDwUbJqIxQhhKWzOGYOUi8IYzE56W0lojGxnV1NOqA790g==
|
||||
dependencies:
|
||||
ra-core "^5.8.3"
|
||||
ra-core "^5.8.2"
|
||||
|
||||
ra-language-italian@^3.13.1:
|
||||
version "3.13.1"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-italian/-/ra-language-italian-3.13.1.tgz#115f15c00f140ba319d5daf53c7bd477c73b9546"
|
||||
integrity sha512-iGgdkbnpA+5GD6OcAjOuOA95/jmJegC9txE8X+AmlA7vhsHdcnHam/D6goqv3sqfeqgCkPCPmJAMO/+slHXR1w==
|
||||
|
||||
ra-language-russian@^5.4.4:
|
||||
version "5.4.4"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-russian/-/ra-language-russian-5.4.4.tgz#96160cc5624e7f0d078d4f5a69d79d46f8a3297c"
|
||||
integrity sha512-a3zPOBZWan3pWW70Oj7MA0xnOlll//5iY3cwURUnzH4lkzChmYY9nUvMugErDy5n6PWY/GzpVkFyXLPFtD5whg==
|
||||
ra-language-russian@^5.4.3:
|
||||
version "5.4.3"
|
||||
resolved "https://registry.yarnpkg.com/ra-language-russian/-/ra-language-russian-5.4.3.tgz#f746f20514306eda835411dd3086a3e3ff786a41"
|
||||
integrity sha512-Pe2meeU1k6UTr9LCxdtbpHIqfvTtZVdohi4GQInp9pOAAdoqmABnNsqQt1OBb8I9gSqZcKW5fIwvA4AXEsWmyA==
|
||||
dependencies:
|
||||
ra-core "^5.4.3"
|
||||
|
||||
ra-ui-materialui@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/ra-ui-materialui/-/ra-ui-materialui-5.8.3.tgz#221905c8712d2f005d9ff12a35d19a6fcf29a759"
|
||||
integrity sha512-iIxPdeTKRI4LJJtEjOrHQYJDs0ocldqfSNHA+jolAb5Uqmx+4n4WLy6VWxHHqlrNO8XB6HNFbL+avHWqBuw4NQ==
|
||||
ra-ui-materialui@^5.8.2:
|
||||
version "5.8.2"
|
||||
resolved "https://registry.yarnpkg.com/ra-ui-materialui/-/ra-ui-materialui-5.8.2.tgz#152f8e7873b2531264f5c0b03c8f049b4934be5c"
|
||||
integrity sha512-/IW15sLVwgN/pagGD4frnYayNGewgvlxx9J3hw+X68Bid+ryE0nGUUxJiOn/47cQWwEPqBh08vBPnPsxVAzAYg==
|
||||
dependencies:
|
||||
"@tanstack/react-query" "^5.21.7"
|
||||
autosuggest-highlight "^3.1.1"
|
||||
@@ -4569,19 +4629,19 @@ ra-ui-materialui@^5.8.3:
|
||||
react-error-boundary "^4.0.13"
|
||||
react-transition-group "^4.4.5"
|
||||
|
||||
react-admin@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/react-admin/-/react-admin-5.8.3.tgz#3278c5aead1e61a56d5584ab8f1d086f8dce3d5f"
|
||||
integrity sha512-zSA9HPHAXYDlcoAvJSDLwUIRaYgeDKh1+hwkpIW8h4/FzcNNztz7w454LSG7/wd0yajAwlsvMKnOkE2U+9bQKw==
|
||||
react-admin@^5.8.2:
|
||||
version "5.8.2"
|
||||
resolved "https://registry.yarnpkg.com/react-admin/-/react-admin-5.8.2.tgz#21fc1d5c37bc45ba05fe39d5ddc734708a3e1b6f"
|
||||
integrity sha512-Uaaibe1KEgeHQa3yCre/TVLQ/zCXU5a4yFHUSnYT+tgyTLm0a+Zr2xExz9dU4qji31Mh9dABXS2aHJJGnpEX+g==
|
||||
dependencies:
|
||||
"@emotion/react" "^11.14.0"
|
||||
"@emotion/styled" "^11.14.0"
|
||||
"@mui/icons-material" "^5.16.12 || ^6.0.0 || ^7.0.0"
|
||||
"@mui/material" "^5.16.12 || ^6.0.0 || ^7.0.0"
|
||||
ra-core "^5.8.3"
|
||||
ra-i18n-polyglot "^5.8.3"
|
||||
ra-language-english "^5.8.3"
|
||||
ra-ui-materialui "^5.8.3"
|
||||
ra-core "^5.8.2"
|
||||
ra-i18n-polyglot "^5.8.2"
|
||||
ra-language-english "^5.8.2"
|
||||
ra-ui-materialui "^5.8.2"
|
||||
react-hook-form "^7.53.0"
|
||||
react-router "^6.28.1 || ^7.1.1"
|
||||
react-router-dom "^6.28.1 || ^7.1.1"
|
||||
@@ -4609,10 +4669,10 @@ react-error-boundary@^4.0.13:
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.12.5"
|
||||
|
||||
react-hook-form@^7.53.0, react-hook-form@^7.57.0:
|
||||
version "7.57.0"
|
||||
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.57.0.tgz#d0bb0c84060c6b9282d99c64566ec919dfca9409"
|
||||
integrity sha512-RbEks3+cbvTP84l/VXGUZ+JMrKOS8ykQCRYdm5aYsxnDquL0vspsyNhGRO7pcH6hsZqWlPOjLye7rJqdtdAmlg==
|
||||
react-hook-form@^7.53.0, react-hook-form@^7.56.4:
|
||||
version "7.56.4"
|
||||
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.56.4.tgz#273f55d43fb24ace3e2b9409d0d5326306d7905e"
|
||||
integrity sha512-Rob7Ftz2vyZ/ZGsQZPaRdIefkgOSrQSPXfqBdvOPwJfoGnjwRJUs7EM7Kc1mcoDv3NOtqBzPGbcMB8CGn9CKgw==
|
||||
|
||||
react-is@^16.13.1, react-is@^16.7.0:
|
||||
version "16.13.1"
|
||||
@@ -4629,7 +4689,7 @@ react-is@^18.0.0:
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
|
||||
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
|
||||
|
||||
"react-is@^18.2.0 || ^19.0.0", react-is@^19.1.0:
|
||||
"react-is@^18.2.0 || ^19.0.0", react-is@^19.0.0, react-is@^19.1.0:
|
||||
version "19.1.0"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.1.0.tgz#805bce321546b7e14c084989c77022351bbdd11b"
|
||||
integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==
|
||||
@@ -4648,17 +4708,17 @@ react-refresh@^0.17.0:
|
||||
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53"
|
||||
integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==
|
||||
|
||||
"react-router-dom@^6.28.1 || ^7.1.1", react-router-dom@^7.6.2:
|
||||
version "7.6.2"
|
||||
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.6.2.tgz#e97e386ab390b6503a2a7968124b7a3237fb10c7"
|
||||
integrity sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA==
|
||||
"react-router-dom@^6.28.1 || ^7.1.1", react-router-dom@^7.6.0:
|
||||
version "7.6.0"
|
||||
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.6.0.tgz#eadcede43856dc714fa3572a946fd7502775c017"
|
||||
integrity sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==
|
||||
dependencies:
|
||||
react-router "7.6.2"
|
||||
react-router "7.6.0"
|
||||
|
||||
react-router@7.6.2, "react-router@^6.28.1 || ^7.1.1", react-router@^7.6.0:
|
||||
version "7.6.2"
|
||||
resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.6.2.tgz#9f48b343bead7d0a94e28342fc4f9ae29131520e"
|
||||
integrity sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==
|
||||
react-router@7.6.0, "react-router@^6.28.1 || ^7.1.1", react-router@^7.6.0:
|
||||
version "7.6.0"
|
||||
resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.6.0.tgz#e2d0872d7bea8df79465a8bba9a20c87c32ce995"
|
||||
integrity sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==
|
||||
dependencies:
|
||||
cookie "^1.0.1"
|
||||
set-cookie-parser "^2.6.0"
|
||||
@@ -5143,12 +5203,13 @@ symbol-tree@^3.2.4:
|
||||
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
||||
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
|
||||
|
||||
synckit@^0.11.7:
|
||||
version "0.11.8"
|
||||
resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.8.tgz#b2aaae998a4ef47ded60773ad06e7cb821f55457"
|
||||
integrity sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==
|
||||
synckit@^0.11.0:
|
||||
version "0.11.4"
|
||||
resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.4.tgz#48972326b59723fc15b8d159803cf8302b545d59"
|
||||
integrity sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==
|
||||
dependencies:
|
||||
"@pkgr/core" "^0.2.4"
|
||||
"@pkgr/core" "^0.2.3"
|
||||
tslib "^2.8.1"
|
||||
|
||||
test-exclude@^6.0.0:
|
||||
version "6.0.0"
|
||||
@@ -5256,7 +5317,7 @@ tsconfig-paths@^3.15.0:
|
||||
minimist "^1.2.6"
|
||||
strip-bom "^3.0.0"
|
||||
|
||||
tslib@^2.7.0:
|
||||
tslib@^2.7.0, tslib@^2.8.1:
|
||||
version "2.8.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
|
||||
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
|
||||
@@ -5333,14 +5394,14 @@ typed-array-length@^1.0.7:
|
||||
possible-typed-array-names "^1.0.0"
|
||||
reflect.getprototypeof "^1.0.6"
|
||||
|
||||
typescript-eslint@^8.33.1:
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.1.tgz#d2d59c9b24afe1f903a855b02145802e4ae930ff"
|
||||
integrity sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==
|
||||
typescript-eslint@^8.32.1:
|
||||
version "8.32.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.32.1.tgz#1784335c781491be528ff84ab666e2f0f7591fd1"
|
||||
integrity sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==
|
||||
dependencies:
|
||||
"@typescript-eslint/eslint-plugin" "8.33.1"
|
||||
"@typescript-eslint/parser" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/eslint-plugin" "8.32.1"
|
||||
"@typescript-eslint/parser" "8.32.1"
|
||||
"@typescript-eslint/utils" "8.32.1"
|
||||
|
||||
typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
|
Reference in New Issue
Block a user