From 171f0126b91f0ee5b8b1ab0a35e1bf6345e1b15f Mon Sep 17 00:00:00 2001
From: Simon Mellerin <simon.mellerin@makina-corpus.com>
Date: Thu, 21 Nov 2024 16:15:54 +0100
Subject: [PATCH] #25 - DistributionForm - add multilingual value for title and
 description

---
 .../OcDatasetFormStep5/OcDatasetFormStep5.vue | 37 +++++++++++++++++--
 .../OcDistributionForm/OcDistributionForm.vue | 31 ++++++++++++----
 src/sparql/distribution.ts                    |  5 +--
 3 files changed, 59 insertions(+), 14 deletions(-)

diff --git a/src/components/DatasetMultiStep/OcDatasetFormStep5/OcDatasetFormStep5.vue b/src/components/DatasetMultiStep/OcDatasetFormStep5/OcDatasetFormStep5.vue
index 0ead0e0..38bb204 100644
--- a/src/components/DatasetMultiStep/OcDatasetFormStep5/OcDatasetFormStep5.vue
+++ b/src/components/DatasetMultiStep/OcDatasetFormStep5/OcDatasetFormStep5.vue
@@ -160,10 +160,41 @@
       <hr class="w-full my-6 border-t border-gray-400" />
       <Accordion :value="['0']" class="w-full" multiple>
         <AccordionPanel :value="key" v-for="(distribution, key) in model.distribution" :key="key">
-          <AccordionHeader>{{ distribution.title }}</AccordionHeader>
+          <AccordionHeader>{{ translateValue(distribution.title) }}</AccordionHeader>
           <AccordionContent pt:content="flex flex-wrap">
-            <OcField :metadata="distributionMetadata.description" for="description" class="w-full">
-              {{ distribution.description }}
+            <OcField
+              v-if="distribution.title"
+              :metadata="distributionMetadata.title"
+              for="title"
+              class="w-full"
+            >
+              <div class="flex gap-2 flex-col">
+                <div
+                  v-for="(title, key) in distribution.title"
+                  :key="key"
+                  class="border w-full rounded-md"
+                >
+                  <Tag :value="key" severity="secondary" icon="fa-solid fa-globe" />
+                  <span class="m-2">{{ title }}</span>
+                </div>
+              </div>
+            </OcField>
+            <OcField
+              v-if="distribution.description"
+              :metadata="distributionMetadata.description"
+              for="description"
+              class="w-full"
+            >
+              <div class="flex gap-2 flex-col">
+                <div
+                  v-for="(description, key) in distribution.description"
+                  :key="key"
+                  class="flex items-start border w-full rounded-md"
+                >
+                  <Tag :value="key" severity="secondary" icon="fa-solid fa-globe" />
+                  <span class="m-2">{{ description }}</span>
+                </div>
+              </div>
             </OcField>
             <OcField
               v-if="distribution.license"
diff --git a/src/components/OcDistributionForm/OcDistributionForm.vue b/src/components/OcDistributionForm/OcDistributionForm.vue
index e092b62..d227152 100644
--- a/src/components/OcDistributionForm/OcDistributionForm.vue
+++ b/src/components/OcDistributionForm/OcDistributionForm.vue
@@ -1,14 +1,26 @@
 <template>
   <Form @submit="submit" :validation-schema="validationSchema" :initial-values="model">
-    <Field name="title" v-slot="{ field, errorMessage }">
+    <Field name="title" v-slot="{ value, handleChange, errorMessage }">
       <OcField for="title" :metadata="distributionMetadata.title">
-        <InputText id="title" v-bind="field" :invalid="!!errorMessage" required fluid />
+        <OcMultilingualField
+          id="title"
+          :initial-value="value"
+          @updateValue="handleChange"
+          :inputComponent="InputText"
+          :inputProps="{ invalid: !!errorMessage, required: true, fluid: true }"
+        />
       </OcField>
       <Message v-if="errorMessage" severity="error">{{ errorMessage }}</Message>
     </Field>
-    <Field name="description" v-slot="{ field, errorMessage }">
+    <Field name="description" v-slot="{ value, handleChange, errorMessage }">
       <OcField for="description" :metadata="distributionMetadata.description">
-        <Textarea id="description" v-bind="field" :invalid="!!errorMessage" required fluid />
+        <OcMultilingualField
+          id="description"
+          :initial-value="value"
+          @updateValue="handleChange"
+          :inputComponent="Textarea"
+          :inputProps="{ invalid: !!errorMessage, required: true, fluid: true }"
+        />
       </OcField>
       <Message v-if="errorMessage" severity="error">{{ errorMessage }}</Message>
     </Field>
@@ -129,7 +141,7 @@
 
 <script setup lang="ts">
 import { useTranslateValue } from '@/composables/useTranslateValue'
-import type { OcDistribution, OcService, OcConcept } from '@/declarations'
+import type { OcDistribution, OcService, OcConcept, LocalizedProperty } from '@/declarations'
 import { toTypedSchema } from '@vee-validate/yup'
 import Button from 'primevue/button'
 import { Field, Form, type GenericObject } from 'vee-validate'
@@ -145,6 +157,7 @@ import OcConceptSelect from '../FormInputs/OcConceptSelect/OcConceptSelect.vue'
 import OcServiceAutocomplete from '../FormInputs/OcServiceAutocomplete/OcServiceAutocomplete.vue'
 import OcConceptAutocomplete from '../FormInputs/OcConceptAutocomplete/OcConceptAutocomplete.vue'
 import OcLicenseSelect from '../FormInputs/OcLicenseSelect/OcLicenseSelect.vue'
+import OcMultilingualField from '../FormInputs/OcMultilingualField/OcMultilingualField.vue'
 
 const { t } = useI18n()
 const { translateValue } = useTranslateValue()
@@ -158,9 +171,12 @@ const emit = defineEmits<{
 
 const validationSchema = toTypedSchema(
   yup.object({
-    title: yup.string().required().label(translateValue(distributionMetadata.title.label)),
+    title: yup
+      .mixed<LocalizedProperty<string>>()
+      .required()
+      .label(translateValue(distributionMetadata.title.label)),
     description: yup
-      .string()
+      .mixed<LocalizedProperty<string>>()
       .required()
       .label(translateValue(distributionMetadata.description.label)),
     license: yup.mixed<OcConcept>().label(translateValue(distributionMetadata.license.label)),
@@ -182,7 +198,6 @@ const validationSchema = toTypedSchema(
 )
 
 const submit = (values: GenericObject) => {
-  console.log('save')
   model.value = values
 
   emit('save')
diff --git a/src/sparql/distribution.ts b/src/sparql/distribution.ts
index 4ead4c6..3e80719 100644
--- a/src/sparql/distribution.ts
+++ b/src/sparql/distribution.ts
@@ -1,6 +1,5 @@
 import type {
   Credentials,
-  OcConcept,
   OcDataset,
   OcDistribution,
   OcDistributionSummary,
@@ -14,7 +13,7 @@ import {
   executeSparqlConstruct
 } from './sparql'
 import { resourceContext } from './resource'
-import { ContextDefinition } from 'jsonld'
+import { type ContextDefinition } from 'jsonld'
 
 export async function insertDistribution(
   distribution: Partial<OcDistribution>,
@@ -142,7 +141,7 @@ export async function getDistribution(
       '@container': '@language'
     }
   }
-  
+
   const frame = {
     '@context': context,
     '@type': [
-- 
GitLab