1 | import React from "react";
|
2 | import { useDataObject } from "./context";
|
3 | import { useFetchData } from "@olenbetong/react-data-object-connect";
|
4 | import setDataObjectField from "./setDataObjectField";
|
5 |
|
6 | function 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 |
|
60 | export default React.forwardRef(BoundSelect);
|