From a36a12c2bc4a5348c7eb7b890608822c448b62c4 Mon Sep 17 00:00:00 2001 From: vincentlu <t1341870251@gmail.com> Date: 星期一, 10 二月 2025 10:12:22 +0800 Subject: [PATCH] # --- rsf-admin/src/page/login/Login.jsx | 52 +++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 41 insertions(+), 11 deletions(-) diff --git a/rsf-admin/src/page/login/Login.jsx b/rsf-admin/src/page/login/Login.jsx index e30af97..0eedaad 100644 --- a/rsf-admin/src/page/login/Login.jsx +++ b/rsf-admin/src/page/login/Login.jsx @@ -7,14 +7,19 @@ Button, TextField, Stack, - Autocomplete + Autocomplete, + InputAdornment, + IconButton, } from '@mui/material'; import { useTranslate, useLogin, useNotify, } from 'react-admin'; -import { useForm, Controller } from 'react-hook-form'; +import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; +import ProviderChoices from "./ProviderChoices"; +import Visibility from '@mui/icons-material/Visibility'; +import VisibilityOff from '@mui/icons-material/VisibilityOff'; const Login = (props) => { const translate = useTranslate(); @@ -23,9 +28,10 @@ const location = useLocation(); const { tenantList } = props; - const { control, watch, handleSubmit, setValue } = useForm(); + const { control, handleSubmit, watch, setValue, getValues } = useForm(); const [loading, setLoading] = useState(false); + const [showPassword, setShowPassword] = useState(false); const username = watch('username'); const password = watch('password'); @@ -33,7 +39,12 @@ useEffect(() => { if (tenantList.length > 0 && !tenantId) { - setValue('tenantId', tenantList[0].id); + const rememberTenantId = localStorage.getItem('remember_tenantId'); + if (rememberTenantId && tenantList.some(t => t.id === Number(rememberTenantId))) { + setValue('tenantId', Number(rememberTenantId)); + } else { + setValue('tenantId', tenantList[0].id); + } } }, [tenantList, setValue]); @@ -87,7 +98,9 @@ getOptionLabel={(option) => option.name} value={selectedTenant} onChange={(_, newValue) => { - onChange(newValue ? newValue.id : ''); + const newTenantId = newValue ? newValue.id : ''; + onChange(newTenantId); + localStorage.setItem('remember_tenantId', newTenantId); }} renderInput={(params) => ( <TextField @@ -110,10 +123,11 @@ render={({ field }) => ( <TextField {...field} - label={translate('ra.auth.username')} + label={translate("page.login.username")} variant="standard" disabled={loading} autoFocus + autoComplete="off" /> )} /> @@ -126,23 +140,37 @@ render={({ field }) => ( <TextField {...field} - label={translate('ra.auth.password')} - type="password" + label={translate("page.login.password")} + type={showPassword ? 'text' : 'password'} variant="standard" disabled={loading} - + autoComplete="off" + InputProps={{ + endAdornment: ( + <InputAdornment position="end"> + <IconButton + aria-label="toggle password visibility" + onClick={() => setShowPassword((show) => !show)} + onMouseDown={(event) => { event.preventDefault() }} + edge="end" + > + {showPassword ? <VisibilityOff /> : <Visibility />} + </IconButton> + </InputAdornment> + ), + }} /> )} /> - <Box mt={10}></Box> + <Box /> <Button type="submit" variant="contained" disabled={loading || !(tenantId && username && password)} sx={{ - backgroundColor: "#3D4BA7" + // backgroundColor: "#3D4BA7" }} > {loading && <CircularProgress size={25} thickness={2} />} @@ -151,6 +179,8 @@ </Stack> <Box mt={1} mb={1} sx={{ textAlign: 'center' }}>or</Box> + + <ProviderChoices type="LOG IN" /> </Box > </> ) -- Gitblit v1.9.1