feat(FE-166-169): Slicing UI Penjualan Form dan Client side validation

This commit is contained in:
randy-ar
2025-11-06 13:45:52 +07:00
parent d8637923bd
commit 158971d904
13 changed files with 1344 additions and 152 deletions
+10 -6
View File
@@ -55,6 +55,7 @@ interface SelectInputBaseProps<T = OptionType> {
delay?: number;
onInputChange?: (search: string) => void;
startAdornment?: ReactNode;
menuPortalTarget?: HTMLElement | null;
}
interface SelectInputProps<T = OptionType> extends SelectInputBaseProps<T> {
@@ -68,7 +69,7 @@ const animatedComponents = makeAnimated();
const CustomControl = <
Option,
IsMulti extends boolean,
Group extends GroupBase<Option>
Group extends GroupBase<Option>,
>(
props: ControlProps<Option, IsMulti, Group>
) => {
@@ -117,6 +118,7 @@ const SelectInput = <T extends OptionType>(props: SelectInputProps<T>) => {
createables = false,
onInputChange,
startAdornment,
menuPortalTarget,
} = props;
const [internalInputValue, setInternalInputValue] = useState('');
@@ -186,7 +188,7 @@ const SelectInput = <T extends OptionType>(props: SelectInputProps<T>) => {
<SelectComponent<T, boolean, GroupBase<T>>
instanceId='select'
value={value ?? (isMulti ? [] : undefined)}
value={value ?? (isMulti ? [] : null)}
onChange={onChange ? handleChange : undefined}
options={options}
menuIsOpen={openMenu}
@@ -257,7 +259,9 @@ const SelectInput = <T extends OptionType>(props: SelectInputProps<T>) => {
startAdornment,
})}
menuPortalTarget={
typeof document !== 'undefined' ? document.body : undefined
typeof document !== 'undefined'
? (menuPortalTarget ?? document.body)
: undefined
}
styles={{
menuPortal: (base) => ({ ...base, zIndex: 9999 }),
@@ -274,8 +278,8 @@ const SelectInput = <T extends OptionType>(props: SelectInputProps<T>) => {
const useSelect = <T,>(
basePath: string,
valueKey: keyof T,
labelKey: keyof T,
valueKey: keyof T | string,
labelKey: keyof T | string,
searchKey: string = 'search',
params?: { [key: string]: string }
) => {
@@ -286,7 +290,7 @@ const useSelect = <T,>(
[searchKey]: inputValue ?? '',
...params,
}).toString();
}, [inputValue, searchKey]);
}, [inputValue, searchKey, params]);
const optionsUrl = `${basePath}?${optionsUrlParams}`;