UNPKG

1.57 kBJavaScriptView Raw
1import React from "react";
2import { useDataObject } from "./context";
3import { useFetchData } from "@olenbetong/react-data-object-connect";
4import setDataObjectField from "./setDataObjectField";
5
6function BoundSelect(
7 {
8 as,
9 children,
10 dataObject,
11 descriptionField,
12 field,
13 filter = "",
14 nullable,
15 option,
16 optionComponent,
17 valueField,
18 ...other
19 },
20 forwardRef
21) {
22 const Component = as ? as : "select";
23 const OptionComponent = optionComponent ? optionComponent : "option";
24 const { currentRow: record, dataObject: targetDataObject } = useDataObject(targetDataObject);
25
26 let isNullable = nullable;
27 if (typeof nullable !== "boolean") {
28 if (targetDataObject && targetDataObject.getFields) {
29 let fieldDef = targetDataObject.getFields(field);
30 isNullable = fieldDef.nullable;
31 }
32 }
33
34 const { data } = useFetchData(dataObject, dataObject ? filter : false);
35
36 return (
37 <Component
38 value={record[field] || ""}
39 onChange={evt => setDataObjectField(targetDataObject, field, evt)}
40 data-field={field}
41 {...other}
42 ref={forwardRef}
43 >
44 {isNullable && <OptionComponent value="" />}
45 {children}
46 {dataObject &&
47 data.map(record =>
48 option ? (
49 option(record)
50 ) : (
51 <OptionComponent key={record[valueField]} value={record[valueField]}>
52 {record[descriptionField || valueField]}
53 </OptionComponent>
54 )
55 )}
56 </Component>
57 );
58}
59
60export default React.forwardRef(BoundSelect);