feat: add password hide show logic for init server

This commit is contained in:
lihui
2025-01-16 00:03:30 +08:00
committed by dashuai
parent 581f73c857
commit 013df362ca
3 changed files with 54 additions and 17 deletions
+1
View File
@@ -39,6 +39,7 @@
"qs": "^6.11.0",
"react": "^18.2.0",
"react-bootstrap": "^2.10.0",
"react-bootstrap-icons": "^1.11.5",
"react-dom": "^18.2.0",
"react-helmet-async": "^1.3.0",
"react-i18next": "^11.18.3",
+13 -1
View File
@@ -77,6 +77,9 @@ importers:
react-bootstrap:
specifier: ^2.10.0
version: 2.10.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)
react-bootstrap-icons:
specifier: ^1.11.5
version: 1.11.5(react@18.2.0)
react-dom:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
@@ -8176,7 +8179,7 @@ packages:
dependencies:
universalify: 2.0.0
optionalDependencies:
graceful-fs: 4.2.10
graceful-fs: 4.2.11
/jsonp@0.2.1:
resolution: {integrity: sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw==}
@@ -9913,6 +9916,15 @@ packages:
semver: 5.7.1
dev: true
/react-bootstrap-icons@1.11.5(react@18.2.0):
resolution: {integrity: sha512-eOhtFJMUqw98IJcfKJsSMZkFHCeNPTTwXZAe9V9d4mT22ARmbrISxPO9GmtWWuf72zQctLeZMGodX/q6wrbYYg==}
peerDependencies:
react: '>=16.8.6'
dependencies:
prop-types: 15.8.1
react: 18.2.0
dev: false
/react-bootstrap@2.10.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-87gRP69VAfeU2yKgp8RI3HvzhPNrnYIV2QNranYXataz3ef+k7OhvKGGdxQLQfUsQ2RTmlY66tn4pdFrZ94hNg==}
peerDependencies:
@@ -17,8 +17,9 @@
* under the License.
*/
import { FC, FormEvent } from 'react';
import { FC, FormEvent, useState } from 'react';
import { Form, Button } from 'react-bootstrap';
import { Eye, EyeSlash } from 'react-bootstrap-icons';
import { useTranslation } from 'react-i18next';
import type { FormDataType } from '@/common/interface';
@@ -34,6 +35,8 @@ interface Props {
const Index: FC<Props> = ({ visible, data, changeCallback, nextCallback }) => {
const { t } = useTranslation('translation', { keyPrefix: 'install' });
const [showPassword, setShowPassword] = useState(false);
const checkValidated = (): boolean => {
let bol = true;
const { site_name, site_url, contact_email, name, password, email } = data;
@@ -295,21 +298,42 @@ const Index: FC<Props> = ({ visible, data, changeCallback, nextCallback }) => {
<Form.Group controlId="password" className="mb-3">
<Form.Label>{t('admin_password.label')}</Form.Label>
<Form.Control
required
type="password"
value={data.password.value}
isInvalid={data.password.isInvalid}
onChange={(e) => {
changeCallback({
password: {
value: e.target.value,
isInvalid: false,
errorMsg: '',
},
});
}}
/>
<div className="position-relative">
<Form.Control
required
type={showPassword ? 'text' : 'password'}
value={data.password.value}
isInvalid={data.password.isInvalid}
style={{ paddingRight: '45px' }}
onChange={(e) => {
changeCallback({
password: {
value: e.target.value,
isInvalid: false,
errorMsg: '',
},
});
}}
/>
<button
type="button"
className="position-absolute top-50 translate-middle-y bg-transparent border-0"
style={{
cursor: 'pointer',
right: '12px',
padding: '4px',
}}
aria-label={showPassword ? t('hide_password') : t('show_password')}
onMouseDown={() => setShowPassword(true)}
onMouseUp={() => setShowPassword(false)}
onMouseLeave={() => setShowPassword(false)}>
{showPassword ? (
<Eye className="text-secondary" size={18} />
) : (
<EyeSlash className="text-secondary" size={18} />
)}
</button>
</div>
<Form.Text>{t('admin_password.text')}</Form.Text>
<Form.Control.Feedback type="invalid">
{data.password.errorMsg}