@hilla/react-crud
Version:
Hilla CRUD utils for React
109 lines (108 loc) • 4.65 kB
JavaScript
import { jsx } from "react/jsx-runtime";
import { _enum } from "@hilla/form";
import { Checkbox } from "@hilla/react-components/Checkbox.js";
import { DatePicker } from "@hilla/react-components/DatePicker.js";
import { DateTimePicker } from "@hilla/react-components/DateTimePicker.js";
import { IntegerField } from "@hilla/react-components/IntegerField.js";
import { NumberField } from "@hilla/react-components/NumberField.js";
import { Select } from "@hilla/react-components/Select.js";
import { TextArea } from "@hilla/react-components/TextArea.js";
import { TextField } from "@hilla/react-components/TextField.js";
import { TimePicker } from "@hilla/react-components/TimePicker.js";
import { useFormPart } from "@hilla/react-form";
import { useEffect, useMemo } from "react";
import { useDatePickerI18n, useDateTimePickerI18n } from "./locale.js";
import { convertToTitleCase } from "./util.js";
function getPropertyModel(form, propertyInfo) {
const pathParts = propertyInfo.name.split(".");
return pathParts.reduce((model, property) => model ? model[property] : void 0, form.model);
}
function AutoFormTextField({ field, fieldProps }) {
return /* @__PURE__ */ jsx(TextField, { ...field, ...fieldProps });
}
function AutoFormIntegerField({ field, fieldProps }) {
return /* @__PURE__ */ jsx(IntegerField, { ...field, ...fieldProps });
}
function AutoFormDecimalField({ field, fieldProps }) {
return /* @__PURE__ */ jsx(NumberField, { ...field, ...fieldProps });
}
function AutoFormDateField({ field, fieldProps }) {
const i18n = useDatePickerI18n();
return /* @__PURE__ */ jsx(DatePicker, { i18n, ...field, ...fieldProps });
}
function AutoFormTimeField({ field, fieldProps }) {
return /* @__PURE__ */ jsx(TimePicker, { ...field, ...fieldProps });
}
function AutoFormDateTimeField({ field, fieldProps }) {
const i18n = useDateTimePickerI18n();
return /* @__PURE__ */ jsx(DateTimePicker, { i18n, ...field, ...fieldProps });
}
function AutoFormEnumField({ model, field, fieldProps }) {
const enumModel = model;
const options = Object.keys(enumModel[_enum]).map((value) => ({
label: convertToTitleCase(value),
value
}));
return /* @__PURE__ */ jsx(Select, { ...field, ...fieldProps, items: options });
}
function AutoFormBooleanField({ field, fieldProps }) {
return /* @__PURE__ */ jsx(Checkbox, { ...field, ...fieldProps });
}
function AutoFormObjectField({ model, fieldProps }) {
const part = useFormPart(model);
const jsonString = part.value ? JSON.stringify(part.value) : "";
return /* @__PURE__ */ jsx(TextArea, { ...fieldProps, value: jsonString, readonly: true });
}
function AutoFormField(props) {
const { form, propertyInfo, options } = props;
const label = options.label ?? propertyInfo.humanReadableName;
const model = getPropertyModel(form, propertyInfo);
const field = form.field(model);
const formPart = useFormPart(model);
const defaultValidators = useMemo(() => formPart.validators, []);
const { validators } = options;
useEffect(() => {
formPart.setValidators([...defaultValidators, ...validators ?? []]);
}, [validators]);
if (options.renderer) {
const customFieldProps = { ...field, disabled: props.disabled, label };
return options.renderer({ field: customFieldProps });
}
const fieldProps = {
id: options.id,
className: options.className,
style: options.style,
label,
placeholder: options.placeholder,
helperText: options.helperText,
colspan: options.colspan,
disabled: options.disabled ?? props.disabled,
readonly: options.readonly
};
switch (props.propertyInfo.type) {
case "string":
return /* @__PURE__ */ jsx(AutoFormTextField, { model, field, fieldProps });
case "integer":
return /* @__PURE__ */ jsx(AutoFormIntegerField, { model, field, fieldProps });
case "decimal":
return /* @__PURE__ */ jsx(AutoFormDecimalField, { model, field, fieldProps });
case "date":
return /* @__PURE__ */ jsx(AutoFormDateField, { model, field, fieldProps });
case "time":
return /* @__PURE__ */ jsx(AutoFormTimeField, { model, field, fieldProps });
case "datetime":
return /* @__PURE__ */ jsx(AutoFormDateTimeField, { model, field, fieldProps });
case "enum":
return /* @__PURE__ */ jsx(AutoFormEnumField, { model, field, fieldProps });
case "boolean":
return /* @__PURE__ */ jsx(AutoFormBooleanField, { model, field, fieldProps });
case "object":
return /* @__PURE__ */ jsx(AutoFormObjectField, { model, field, fieldProps });
default:
return null;
}
}
export {
AutoFormField
};
//# sourceMappingURL=autoform-field.js.map