mirror of
https://gitee.com/ant-design/ant-design.git
synced 2024-12-02 03:59:01 +08:00
fix: make eye icon in Password unclickable when Form is disabled (#50616)
This commit is contained in:
parent
d1692fb6e5
commit
d19d82544d
@ -11,6 +11,7 @@ import { ConfigContext } from '../config-provider';
|
|||||||
import useRemovePasswordTimeout from './hooks/useRemovePasswordTimeout';
|
import useRemovePasswordTimeout from './hooks/useRemovePasswordTimeout';
|
||||||
import type { InputProps, InputRef } from './Input';
|
import type { InputProps, InputRef } from './Input';
|
||||||
import Input from './Input';
|
import Input from './Input';
|
||||||
|
import DisabledContext from '../config-provider/DisabledContext';
|
||||||
|
|
||||||
const defaultIconRender = (visible: boolean): React.ReactNode =>
|
const defaultIconRender = (visible: boolean): React.ReactNode =>
|
||||||
visible ? <EyeOutlined /> : <EyeInvisibleOutlined />;
|
visible ? <EyeOutlined /> : <EyeInvisibleOutlined />;
|
||||||
@ -36,12 +37,16 @@ type IconPropsType = React.HTMLAttributes<HTMLSpanElement> & React.Attributes;
|
|||||||
|
|
||||||
const Password = React.forwardRef<InputRef, PasswordProps>((props, ref) => {
|
const Password = React.forwardRef<InputRef, PasswordProps>((props, ref) => {
|
||||||
const {
|
const {
|
||||||
disabled,
|
disabled: customDisabled,
|
||||||
action = 'click',
|
action = 'click',
|
||||||
visibilityToggle = true,
|
visibilityToggle = true,
|
||||||
iconRender = defaultIconRender,
|
iconRender = defaultIconRender,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
// ===================== Disabled =====================
|
||||||
|
const disabled = React.useContext(DisabledContext);
|
||||||
|
const mergedDisabled = customDisabled ?? disabled;
|
||||||
|
|
||||||
const visibilityControlled =
|
const visibilityControlled =
|
||||||
typeof visibilityToggle === 'object' && visibilityToggle.visible !== undefined;
|
typeof visibilityToggle === 'object' && visibilityToggle.visible !== undefined;
|
||||||
const [visible, setVisible] = useState(() =>
|
const [visible, setVisible] = useState(() =>
|
||||||
@ -59,7 +64,7 @@ const Password = React.forwardRef<InputRef, PasswordProps>((props, ref) => {
|
|||||||
const removePasswordTimeout = useRemovePasswordTimeout(inputRef);
|
const removePasswordTimeout = useRemovePasswordTimeout(inputRef);
|
||||||
|
|
||||||
const onVisibleChange = () => {
|
const onVisibleChange = () => {
|
||||||
if (disabled) {
|
if (mergedDisabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (visible) {
|
if (visible) {
|
||||||
|
@ -10601,6 +10601,48 @@ exports[`renders components/input/demo/password-input.tsx extend context correct
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
class="ant-space-item"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="ant-input-affix-wrapper ant-input-disabled ant-input-affix-wrapper-disabled ant-input-outlined ant-input-password"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
class="ant-input ant-input-disabled"
|
||||||
|
disabled=""
|
||||||
|
placeholder="disabled input password"
|
||||||
|
type="password"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
class="ant-input-suffix"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
aria-label="eye-invisible"
|
||||||
|
class="anticon anticon-eye-invisible ant-input-password-icon"
|
||||||
|
role="img"
|
||||||
|
tabindex="-1"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
data-icon="eye-invisible"
|
||||||
|
fill="currentColor"
|
||||||
|
focusable="false"
|
||||||
|
height="1em"
|
||||||
|
viewBox="64 64 896 896"
|
||||||
|
width="1em"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 000-51.5zm-63.57-320.64L836 122.88a8 8 0 00-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 000 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 000 11.31L155.17 889a8 8 0 0011.31 0l712.15-712.12a8 8 0 000-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 00-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 01146.2-106.69L401.31 546.2A112 112 0 01396 512z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 00227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 01-112 112z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
@ -3947,6 +3947,48 @@ exports[`renders components/input/demo/password-input.tsx correctly 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
class="ant-space-item"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="ant-input-affix-wrapper ant-input-disabled ant-input-affix-wrapper-disabled ant-input-outlined ant-input-password"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
class="ant-input ant-input-disabled"
|
||||||
|
disabled=""
|
||||||
|
placeholder="disabled input password"
|
||||||
|
type="password"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
class="ant-input-suffix"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
aria-label="eye-invisible"
|
||||||
|
class="anticon anticon-eye-invisible ant-input-password-icon"
|
||||||
|
role="img"
|
||||||
|
tabindex="-1"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
data-icon="eye-invisible"
|
||||||
|
fill="currentColor"
|
||||||
|
focusable="false"
|
||||||
|
height="1em"
|
||||||
|
viewBox="64 64 896 896"
|
||||||
|
width="1em"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 000-51.5zm-63.57-320.64L836 122.88a8 8 0 00-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 000 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 000 11.31L155.17 889a8 8 0 0011.31 0l712.15-712.12a8 8 0 000-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 00-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 01146.2-106.69L401.31 546.2A112 112 0 01396 512z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 00227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 01-112 112z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ const App: React.FC = () => {
|
|||||||
{passwordVisible ? 'Hide' : 'Show'}
|
{passwordVisible ? 'Hide' : 'Show'}
|
||||||
</Button>
|
</Button>
|
||||||
</Space>
|
</Space>
|
||||||
|
<Input.Password disabled placeholder="disabled input password" />
|
||||||
</Space>
|
</Space>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -466,6 +466,7 @@ const genAffixStyle: GenerateStyle<InputToken> = (token: InputToken) => {
|
|||||||
} = token;
|
} = token;
|
||||||
|
|
||||||
const affixCls = `${componentCls}-affix-wrapper`;
|
const affixCls = `${componentCls}-affix-wrapper`;
|
||||||
|
const affixClsDisabled = `${componentCls}-affix-wrapper-disabled`;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
[affixCls]: {
|
[affixCls]: {
|
||||||
@ -552,6 +553,17 @@ const genAffixStyle: GenerateStyle<InputToken> = (token: InputToken) => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
[affixClsDisabled]: {
|
||||||
|
// password disabled
|
||||||
|
[`${iconCls}${componentCls}-password-icon`]: {
|
||||||
|
color: colorIcon,
|
||||||
|
cursor: 'not-allowed',
|
||||||
|
|
||||||
|
'&:hover': {
|
||||||
|
color: colorIcon,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user