* Small refactor to CharLimitedFieldset Some methods were renamed for clarity. <input> props are actually put on the input properly. * Add tabindex to Popover trigger * Add tabindex to Switch and SwitchTableField * Add tabindex to DurationInput * Add new properties * Added guidebooks to RaidGroup * Added auto_summon to Party * Conditionally render description in TableField * Improve SwitchTableField * Add support for passing in classes * Add support for passing a disabled prop * Pass description to TableField * Right-align switch * Add support for Extra color switch * Align SliderTableField input to right * Align SelectTableField input to right * Update placeholder styles * Fix empty state on DurationInput * Remove tabindex from DurationInput * Update InputTableField Allow for passing down input properties and remove fixed width * Fix dialog footer styles * Update dialog and overlay z-index * Add styles to TableField Added styles for numeric inputs, disabled inputs, and generally cleaning things up * Add guidebooks to RaidCombobox + styles * Added guidebooks to the dummy raid group * Fix background color * Make less tall * Implement EditPartyModal EditPartyModal takes functionality that was in PartyHeader and puts it in a modal dialog. This lets us add fields and reduces the complexity of other components. Translations were also added. * Remove edit functionality * Add darker shadow to Select * Properly send raid ID to server * Show Extra grids based on selected raid * Fix EX badge colors * Use child as value in normal textarea * Remove toggle ability from Extra grids * Remove edit functionality from PartyDetails
78 lines
1.8 KiB
TypeScript
78 lines
1.8 KiB
TypeScript
import React, {
|
|
ForwardRefRenderFunction,
|
|
forwardRef,
|
|
useEffect,
|
|
useState,
|
|
} from 'react'
|
|
|
|
import classNames from 'classnames'
|
|
import './index.scss'
|
|
|
|
interface Props extends React.HTMLProps<HTMLInputElement> {
|
|
fieldName: string
|
|
placeholder: string
|
|
value?: string
|
|
limit: number
|
|
error: string
|
|
onBlur?: (event: React.ChangeEvent<HTMLInputElement>) => void
|
|
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void
|
|
}
|
|
|
|
const CharLimitedFieldset: ForwardRefRenderFunction<HTMLInputElement, Props> = (
|
|
{
|
|
fieldName,
|
|
placeholder,
|
|
value,
|
|
limit,
|
|
error,
|
|
onBlur,
|
|
onChange: onInputChange,
|
|
...props
|
|
},
|
|
ref
|
|
) => {
|
|
// States
|
|
const [currentCount, setCurrentCount] = useState(
|
|
() => limit - (value || '').length
|
|
)
|
|
|
|
// Hooks
|
|
useEffect(() => {
|
|
setCurrentCount(limit - (value || '').length)
|
|
}, [limit, value])
|
|
|
|
// Event handlers
|
|
const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
const { value: inputValue } = event.currentTarget
|
|
setCurrentCount(limit - inputValue.length)
|
|
if (onInputChange) {
|
|
onInputChange(event)
|
|
}
|
|
}
|
|
|
|
// Rendering methods
|
|
return (
|
|
<fieldset className="Fieldset">
|
|
<div className={classNames({ Joined: true }, props.className)}>
|
|
<input
|
|
{...props}
|
|
autoComplete="off"
|
|
className="Input"
|
|
type={props.type}
|
|
name={fieldName}
|
|
placeholder={placeholder}
|
|
defaultValue={value || ''}
|
|
onBlur={onBlur}
|
|
onChange={handleInputChange}
|
|
maxLength={limit}
|
|
ref={ref}
|
|
formNoValidate
|
|
/>
|
|
<span className="Counter">{currentCount}</span>
|
|
</div>
|
|
{error.length > 0 && <p className="InputError">{error}</p>}
|
|
</fieldset>
|
|
)
|
|
}
|
|
|
|
export default forwardRef(CharLimitedFieldset)
|