Skip to content

Commit

Permalink
form: added support for json fields
Browse files Browse the repository at this point in the history
  • Loading branch information
0einstein0 authored and slint committed Jun 20, 2024
1 parent ff7de81 commit 3eddb64
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ export class AdminForm extends Component {
if (defaultValue) {
return defaultValue;
}
if (value.type === "bool") {
return false;
}
if (value.type === "object") {
return null;
}
return "";
}),
};
Expand All @@ -37,17 +43,38 @@ export class AdminForm extends Component {
const { apiEndpoint, pid, successCallback, create } = this.props;
const { addNotification } = this.context;
let response;

const transformedValues = mapValues(values, (value, key) => {
const fieldSchema = this.props.resourceSchema[key];

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.9, postgresql14, opensearch2, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.9, postgresql14, opensearch2, 20.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.9, postgresql14, elasticsearch7, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.9, postgresql14, elasticsearch7, 20.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.10, postgresql14, opensearch2, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.10, postgresql14, opensearch2, 20.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.10, postgresql14, elasticsearch7, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.10, postgresql14, elasticsearch7, 20.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.11, postgresql14, opensearch2, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.11, postgresql14, opensearch2, 20.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.11, postgresql14, elasticsearch7, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.11, postgresql14, elasticsearch7, 20.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.12, postgresql14, opensearch2, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.12, postgresql14, opensearch2, 20.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.12, postgresql14, elasticsearch7, 18.x)

Must use destructuring props assignment

Check warning on line 48 in invenio_administration/assets/semantic-ui/js/invenio_administration/src/formik/AdminForm.js

View workflow job for this annotation

GitHub Actions / tests (3.12, postgresql14, elasticsearch7, 20.x)

Must use destructuring props assignment
if (fieldSchema?.metadata?.type === "json") {
try {
if (value === "") {
return null;
} else if (typeof value === "object") {
return value;
} else {
return JSON.parse(value);
}
} catch (e) {
console.error(`Error parsing JSON for field ${key}:`, e);
actions.setFieldError(key, "Invalid JSON format");
throw e;
}
}
return value;
});

try {
if (create) {
response = await InvenioAdministrationActionsApi.createResource(
apiEndpoint,
values
transformedValues
);
} else {
response = await InvenioAdministrationActionsApi.editResource(
apiEndpoint,
pid,
values
transformedValues
);
}
actions.setSubmitting(false);
Expand Down Expand Up @@ -81,12 +108,24 @@ export class AdminForm extends Component {
this.setState({ error: undefined });
};

transformInitialValues = (formData) => {
const { resourceSchema } = this.props;
return mapValues(formData, (value, key) => {
const fieldSchema = resourceSchema[key];
if (fieldSchema?.metadata?.type === "json" && typeof value === "object") {
return JSON.stringify(value);
}
return value;
});
};

render() {
const { resourceSchema, create, formFields } = this.props;
const { formData, error } = this.state;
const transformedFormData = this.transformInitialValues(formData);

return (
<Formik initialValues={formData} onSubmit={this.onSubmit}>
<Formik initialValues={transformedFormData} onSubmit={this.onSubmit}>
{(props) => {
return (
<>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ const mapFormFields = (obj, parentField, isCreate, formFieldsConfig, dropDumpOnl

if (fieldSchema.type === "bool") {
const description = fieldProps.description;

return (
<>
<BooleanField
Expand All @@ -134,7 +135,7 @@ const mapFormFields = (obj, parentField, isCreate, formFieldsConfig, dropDumpOnl
);
}

if (fieldSchema.type === "object") {
if (fieldSchema.type === "object" && fieldSchema.metadata?.type !== "json") {
// nested fields
return (
<React.Fragment key={fieldProps.fieldPath}>
Expand Down Expand Up @@ -169,7 +170,10 @@ const mapFormFields = (obj, parentField, isCreate, formFieldsConfig, dropDumpOnl
}

const rows = formFieldsConfig[fieldName]?.rows || fieldSchema?.metadata?.rows;
if (fieldSchema.type === "string" && rows) {
if (
(fieldSchema.type === "string" && rows) ||
fieldSchema.metadata?.type === "json"
) {
return (
<TextArea
key={fieldProps.fieldPath}
Expand Down

0 comments on commit 3eddb64

Please sign in to comment.