| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
 | | import * as React from 'react'; |  | import { useState } from 'react'; |  | import { useLocation } from 'react-router-dom'; |  | import { |  |     Avatar, |  |     Box, |  |     Button, |  |     Card, |  |     CardActions, |  |     CircularProgress, |  | } from '@mui/material'; |  | import LockIcon from '@mui/icons-material/Lock'; |  | import { |  |     Form, |  |     required, |  |     TextInput, |  |     useTranslate, |  |     useLogin, |  |     useNotify, |  | } from 'react-admin'; |  | import { LOGIN_BACKGROUND } from '@/config/setting'; |  |   |  | const Login = () => { |  |     const [loading, setLoading] = useState(false); |  |     const translate = useTranslate(); |  |   |  |     const notify = useNotify(); |  |     const login = useLogin(); |  |     const location = useLocation(); |  |   |  |     const handleSubmit = (auth) => { |  |         setLoading(true); |  |         // js native confirm && root |  |         login( |  |             auth, |  |             location.state ? (location.state).nextPathname : '/' |  |         ).catch((error) => { |  |             setLoading(false); |  |             notify( |  |                 typeof error === 'string' |  |                     ? error |  |                     : typeof error === 'undefined' || !error.message |  |                         ? 'ra.auth.sign_in_error' |  |                         : error.message, |  |                 { |  |                     type: 'error', |  |                     messageArgs: { |  |                         _: |  |                             typeof error === 'string' |  |                                 ? error |  |                                 : error && error.message |  |                                     ? error.message |  |                                     : undefined, |  |                     }, |  |                 } |  |             ); |  |         }); |  |     }; |  |   |  |     return ( |  |         <Form onSubmit={handleSubmit} noValidate> |  |             {/* https://unsplash.com/ */} |  |             <Box |  |                 sx={{ |  |                     display: 'flex', |  |                     flexDirection: 'column', |  |                     minHeight: '100vh', |  |                     alignItems: 'center', |  |                     justifyContent: 'flex-start', |  |                     // justifyContent: 'center', |  |                     background: `url(/login_bg2.jpg)`, |  |                     backgroundRepeat: 'no-repeat', |  |                     backgroundSize: 'cover', |  |                 }} |  |             > |  |                 <video |  |                     autoPlay |  |                     loop |  |                     muted |  |                     style={{ |  |                         position: 'fixed', |  |                         top: 0, |  |                         left: 0, |  |                         width: '100%', |  |                         height: '100%', |  |                         // objectFit: 'cover', |  |                         // objectFit: 'contain', |  |                         objectFit: 'fill', |  |                         // objectFit: 'scale-down', |  |                         zIndex: 0, |  |                     }} |  |                 > |  |                     {LOGIN_BACKGROUND === 'media' && ( |  |                         <source src="/login_bg1.mp4" type="video/mp4" /> |  |                     )} |  |                 </video> |  |   |  |                 <Card sx={{ |  |                     minWidth: 300, |  |                     marginTop: '6em', |  |                     zIndex: 1 |  |                 }}> |  |                     <Box |  |                         sx={{ |  |                             margin: '1em', |  |                             display: 'flex', |  |                             justifyContent: 'center', |  |                         }} |  |                     > |  |                         <Avatar sx={{ bgcolor: 'secondary.main' }}> |  |                             <LockIcon /> |  |                         </Avatar> |  |                     </Box> |  |                     <Box |  |                         sx={{ |  |                             marginTop: '1em', |  |                             display: 'flex', |  |                             justifyContent: 'center', |  |                             color: theme => theme.palette.grey[500], |  |                         }} |  |                     > |  |                         Hint: root / 123456 |  |                     </Box> |  |                     <Box sx={{ padding: '0 1em 1em 1em' }}> |  |                         <Box sx={{ marginTop: '1em' }}> |  |                             <TextInput |  |                                 autoFocus |  |                                 source="username" |  |                                 label={translate('ra.auth.username')} |  |                                 disabled={loading} |  |                                 validate={required()} |  |                             /> |  |                         </Box> |  |                         <Box sx={{ marginTop: '1em' }}> |  |                             <TextInput |  |                                 source="password" |  |                                 label={translate('ra.auth.password')} |  |                                 type="password" |  |                                 disabled={loading} |  |                                 validate={required()} |  |                             /> |  |                         </Box> |  |                     </Box> |  |                     <CardActions sx={{ padding: '0 1em 1em 1em' }}> |  |                         <Button |  |                             variant="contained" |  |                             type="submit" |  |                             color="primary" |  |                             disabled={loading} |  |                             fullWidth |  |                         > |  |                             {loading && ( |  |                                 <CircularProgress size={25} thickness={2} /> |  |                             )} |  |                             {translate('ra.auth.sign_in')} |  |                         </Button> |  |                     </CardActions> |  |                 </Card> |  |             </Box> |  |         </Form> |  |     ); |  | }; |  |   |  | export default Login; | 
 |