// Copyright (c) 2022 Robin Davies // // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import React from 'react'; import InputAdornment from '@mui/material/InputAdornment'; import IconButton from '@mui/material/IconButton'; import FormControl from '@mui/material/FormControl'; import FormHelperText from '@mui/material/FormHelperText'; import InputLabel from '@mui/material/InputLabel'; import Input from '@mui/material/Input'; import Visibility from '@mui/icons-material/Visibility'; import VisibilityOff from '@mui/icons-material/VisibilityOff'; interface NoChangePasswordProps { hasPassword: boolean; label: string; defaultValue: string; onPasswordChange: (text: string) => void; disabled?: boolean; helperText?: string; error?: boolean; inputRef?: React.RefObject }; interface NoChangePasswordState { focused: boolean; passwordText: string; showPassword: boolean; }; class NoChangePassword extends React.Component { refText: React.Ref; constructor(props: NoChangePasswordProps) { super(props); this.refText = React.createRef(); this.state = { focused: false, showPassword: false, passwordText: this.props.defaultValue as string }; } handleShowPassword() { this.setState({ showPassword: !this.state.showPassword }); } handleChange(e: React.ChangeEvent) { this.textChanged = true; this.props.onPasswordChange(e.target.value); } textChanged: boolean = false; handleFocus(e: React.FocusEvent) { console.log("onFocus"); if (!this.state.focused) { this.textChanged = false; e.target.value = this.state.passwordText; } e.currentTarget.removeAttribute("readonly"); this.setState({ focused: true }); } handleBlur(e: React.FocusEvent) { console.log("onBlur"); let text = e.target.value as string; this.setState({ focused: false, passwordText: text }); this.props.onPasswordChange(e.target.value); this.textChanged = false; if (text.length === 0 && this.props.hasPassword) { e.target.value = "(Unchanged)"; } e.currentTarget.setAttribute("readonly","true"); } render() { console.log("Render focus: " + this.state.focused) let showUnchanged = (this.state.passwordText.length === 0) && this.props.hasPassword && (!this.state.focused); let thisDefaultValue = showUnchanged ? "(Unchanged)" : this.props.defaultValue; let isText = showUnchanged || this.state.showPassword; return ( {this.props.label} this.handleChange(e)} value={thisDefaultValue} onFocus={(e) => this.handleFocus(e)} onBlur={(e) => this.handleBlur(e)} type={isText ? 'text' : 'password'} style={ { color: showUnchanged? '#888': '#000'} } endAdornment={ this.handleShowPassword()} onMouseDown={(e) => e.preventDefault()} size="large"> {this.state.showPassword ? : } } /> { this.props.helperText} ); } }; export default NoChangePassword;