From 745aa714fa19b0a63cd1a94596b64dd9b13a80b6 Mon Sep 17 00:00:00 2001
From: Guillaume Grossetie
Date: Fri, 11 Oct 2024 12:26:17 +0200
Subject: [PATCH] feat(metadata): create an isolated component
---
front/src/components/Form.jsx | 5 ++--
.../Write/yamleditor/YamlEditor.jsx | 27 +++++------------
front/src/components/corpus/Corpus.graphql | 9 ++++++
front/src/components/corpus/CorpusItem.jsx | 22 ++++++++------
.../src/components/metadata/MetadataForm.jsx | 25 ++++++++++++++++
.../src/components/metadata/MetadataValues.js | 23 +++++++++++++++
.../corpus-journal-metadata.schema.json | 29 +++++++++++++++++++
graphql/package.json | 2 +-
8 files changed, 109 insertions(+), 33 deletions(-)
create mode 100644 front/src/components/metadata/MetadataForm.jsx
create mode 100644 front/src/components/metadata/MetadataValues.js
create mode 100644 front/src/schemas/corpus-journal-metadata.schema.json
diff --git a/front/src/components/Form.jsx b/front/src/components/Form.jsx
index 4e97a913f..0cf2831f9 100644
--- a/front/src/components/Form.jsx
+++ b/front/src/components/Form.jsx
@@ -7,7 +7,6 @@ import { Translation } from 'react-i18next'
import basicUiSchema from '../schemas/ui-schema-basic-override.json'
import defaultUiSchema from '../schemas/ui-schema-editor.json'
import defaultSchema from '../schemas/data-schema.json'
-import { toYaml } from './Write/metadata/yaml'
// REMIND: use a custom SelectWidget to support "ui:emptyValue"
// remove once fixed in https://github.com/rjsf-team/react-jsonschema-form/issues/1041
@@ -256,7 +255,7 @@ export default function SchemaForm ({
const path = id.replace('root_', '').replace('_', '.')
setFormData((state) => {
const newFormData = set(state, path, value)
- onChange(toYaml(newFormData))
+ onChange(newFormData)
return newFormData
})
},
@@ -282,7 +281,7 @@ export default function SchemaForm ({
const handleUpdate = useCallback((event) => {
const formData = event.formData
setFormData(formData)
- onChange(toYaml(formData))
+ onChange(formData)
}, [setFormData, onChange])
// noinspection JSValidateTypes
diff --git a/front/src/components/Write/yamleditor/YamlEditor.jsx b/front/src/components/Write/yamleditor/YamlEditor.jsx
index 2ed7e56e5..ac64b8978 100644
--- a/front/src/components/Write/yamleditor/YamlEditor.jsx
+++ b/front/src/components/Write/yamleditor/YamlEditor.jsx
@@ -1,28 +1,15 @@
-import React from 'react'
+import React, { useCallback } from 'react'
import PropTypes from 'prop-types'
import YAML from 'js-yaml'
import Form from '../../Form'
+import { toYaml } from "../metadata/yaml.js";
+import { convertLegacyValues } from "../../metadata/MetadataValues.js";
-export default function YamlEditor ({ yaml = '', basicMode = false, onChange }) {
+export default function YamlEditor({ yaml = '', basicMode = false, onChange = () => {} }) {
const [parsed = {}] = YAML.loadAll(yaml)
-
- // we convert YYYY/MM/DD dates into ISO YYYY-MM-DD
- if (parsed.date) {
- parsed.date = parsed.date.replace(/\//g, '-')
- }
-
- // we array-ify legacy string keywords
- if (parsed.keywords) {
- parsed.keywords = parsed.keywords.map(block => {
- if (typeof block.list_f === 'string') {
- block.list_f = block.list_f.split(',').map(word => word.trim())
- }
-
- return block
- })
- }
-
- return
+ const formData = convertLegacyValues(parsed)
+ const handleChange = useCallback((newFormData) => onChange(toYaml(newFormData)), [onChange])
+ return
{expanded &&
{corpus.description &&
{corpus.description}
}
-
+
}
@@ -115,16 +116,18 @@ export default function CorpusItem ({ corpus }) {
{t('corpus.deleteModal.confirmMessage')}
- setDeleteCorpusVisible(false)}>{t('modal.cancelButton.text')}
+ setDeleteCorpusVisible(false)}>{t('modal.cancelButton.text')}
{t('modal.confirmButton.text')}
{t('corpus.exportModal.title')}
-
+
- setExportCorpusVisible(false)}>{t('modal.cancelButton.text')}
+ setExportCorpusVisible(false)}>{t('modal.cancelButton.text')}
@@ -132,7 +135,8 @@ export default function CorpusItem ({ corpus }) {
- setEditCorpusVisible(false)}>{t('modal.cancelButton.text')}
+ setEditCorpusVisible(false)}>{t('modal.cancelButton.text')}
)
diff --git a/front/src/components/metadata/MetadataForm.jsx b/front/src/components/metadata/MetadataForm.jsx
new file mode 100644
index 000000000..b9d3facdb
--- /dev/null
+++ b/front/src/components/metadata/MetadataForm.jsx
@@ -0,0 +1,25 @@
+import React from "react";
+import PropTypes from "prop-types";
+
+import Form from "../Form.jsx";
+import { convertLegacyValues } from "./MetadataValues.js";
+
+/**
+ * @param data Values in JSON format
+ * @param templates List of template names
+ * @param onChange Function that return the values in YAML format
+ * @returns {Element}
+ * @constructor
+ */
+export default function MetadataForm({ data, templates, onChange }) {
+ const formData = convertLegacyValues(data)
+ const basicMode = templates.includes('basic')
+ return