import { PropsWithChildren, ReactElement, useEffect, useState } from 'react'; import { Dropdown, IDropdownOption } from '@fluentui/react'; import React from "react"; import { IFormItem, IPropertyRenderProps, lang, IDynamicPredefinedArrayItem, IDynamicPredefinedArrayFieldConfig } from '@wiberg/formbuilder'; interface IProps extends IPropertyRenderProps, string | number | Array | Array | undefined> { config?: IDynamicPredefinedArrayFieldConfig; } export const DynamicPredefinedArrayField = (props: PropsWithChildren>) : ReactElement | null => { const [value, setValue] = useState | Array>(props.value); useEffect(() => setValue(props.value), [props.value]) const [options, setOptions] = useState>(); useEffect(() => { // async fetch of values let asyncGetter = props.config?.predefinedOptions?.optionsAsync as (item: T) => Promise>; if (asyncGetter != null) { setOptions([{key: -1, text: lang.texts.areas.common.loading}]) let fetch = async () => { try { const options = await asyncGetter(props.parent); setOptions(options); } catch (error) { setOptions([{key: -1, text: lang.texts.areas.form.dropdownFailedFetch}]); console.error(error); } }; fetch(); } // use static values else setOptions(props.config?.predefinedOptions?.options); }, [props.config?.predefinedOptions]) const onChange = (option: IDropdownOption | undefined): void => { if (option === undefined) return; let newValue = undefined; if (props.config?.multiSelect) { let parsed = value as Array ?? []; let clone = [...parsed]; if (option.selected) clone.push(option.key); else { const currIndex = clone.indexOf(option.key); if (currIndex > -1) { clone.splice(currIndex, 1); } } newValue = clone; } else newValue = option.key; props.onChange(newValue); }; return : undefined } onChange={(event: React.FormEvent, option?: IDropdownOption, index?: number) => onChange(option) } errorMessage={props.errorMessage} /> }