diff --git a/src/types/Dataset.d.ts b/src/types/Dataset.d.ts index 3a7f7bf0..c9ba2340 100644 --- a/src/types/Dataset.d.ts +++ b/src/types/Dataset.d.ts @@ -238,6 +238,18 @@ export interface DatasetRelatedIdentifiers { related_identifiers: DatasetRelatedIdentifier[]; } +export interface FieldValidation { + name: string; + metadata_header: string; + route: string; +} + +export interface DatasetMetadataValidation { + message: string; + metadata: FieldValidation[]; + route_identifier: string; +} + export interface DatasetHealthsheetRecord { id: number; question: string; diff --git a/src/views/study/dataset/metadata/about/DatasetMetadataOther.vue b/src/views/study/dataset/metadata/about/DatasetMetadataOther.vue index 88654130..6e97d42c 100644 --- a/src/views/study/dataset/metadata/about/DatasetMetadataOther.vue +++ b/src/views/study/dataset/metadata/about/DatasetMetadataOther.vue @@ -19,6 +19,9 @@ const routeParams = { const studyId = routeParams.studyId; const datasetId = routeParams.datasetId; +const routeState = window.history.state; +const missingFieldsList = (routeState?.missingFields || []).map((f) => f).join(", "); + const moduleData = ref({ acknowledgement: "", format: [], @@ -189,6 +192,15 @@ const scrollToSection = (key: string) => { class="w-full" :disabled="studyStore.currentStudyRole === 'viewer'" > +
+ + Please fill the following required field(s): + + {{ missingFieldsList }} + + +
+

Resource Type

diff --git a/src/views/study/dataset/metadata/access-rights/DatasetMetadataAccessRights.vue b/src/views/study/dataset/metadata/access-rights/DatasetMetadataAccessRights.vue index b4a91433..b8b962ab 100644 --- a/src/views/study/dataset/metadata/access-rights/DatasetMetadataAccessRights.vue +++ b/src/views/study/dataset/metadata/access-rights/DatasetMetadataAccessRights.vue @@ -23,6 +23,9 @@ const routeParams = { const studyId = routeParams.studyId; const datasetId = routeParams.datasetId; +const routeState = window.history.state; +const missingFieldsList = (routeState?.missingFields || []).map((f) => f).join(", "); + const displayLicenseEditor = ref(false); const draftLicense = ref(""); const licenseName = ref(""); @@ -250,6 +253,15 @@ const scrollToSection = (key: string) => { label-placement="top" class="w-full overflow-auto" > +

+ + Please fill the following required field(s): + + {{ missingFieldsList }} + + +
+

Access

diff --git a/src/views/study/dataset/metadata/data-management/DatasetMetadataDataManagement.vue b/src/views/study/dataset/metadata/data-management/DatasetMetadataDataManagement.vue index 1622ba8b..641e9ac2 100644 --- a/src/views/study/dataset/metadata/data-management/DatasetMetadataDataManagement.vue +++ b/src/views/study/dataset/metadata/data-management/DatasetMetadataDataManagement.vue @@ -20,6 +20,9 @@ const routeParams = { const studyId = routeParams.studyId; const datasetId = routeParams.datasetId; +const routeState = window.history.state; +const missingFieldsList = (routeState?.missingFields || []).map((f) => f).join(", "); + const moduleData = reactive({ consent: { details: "", @@ -250,6 +253,15 @@ const scrollToSection = (key: string) => { label-placement="top" class="w-full" > +
+ + Please fill the following required field(s): + + {{ missingFieldsList }} + + +
+ diff --git a/src/views/study/dataset/metadata/general-information/DatasetMetadataGeneralInformation.vue b/src/views/study/dataset/metadata/general-information/DatasetMetadataGeneralInformation.vue index 790e7fd1..c298e040 100644 --- a/src/views/study/dataset/metadata/general-information/DatasetMetadataGeneralInformation.vue +++ b/src/views/study/dataset/metadata/general-information/DatasetMetadataGeneralInformation.vue @@ -23,6 +23,9 @@ const routeParams = { const studyId = routeParams.studyId; const datasetId = routeParams.datasetId; +const routeState = window.history.state; +const missingFieldsList = (routeState?.missingFields || []).map((f) => f).join(", "); + const formRef = ref(null); const moduleData = reactive({ dates: [], @@ -308,6 +311,15 @@ const scrollToSection = (key: string) => { label-placement="top" :disabled="studyStore.currentStudyRole === 'viewer'" > +
+ + Please fill the following required field(s): + + {{ missingFieldsList }} + + +
+

Titles

diff --git a/src/views/study/dataset/metadata/identifiers/DatasetMetadataIdentifiers.vue b/src/views/study/dataset/metadata/identifiers/DatasetMetadataIdentifiers.vue index df1f0efa..0ae8b6a7 100644 --- a/src/views/study/dataset/metadata/identifiers/DatasetMetadataIdentifiers.vue +++ b/src/views/study/dataset/metadata/identifiers/DatasetMetadataIdentifiers.vue @@ -21,6 +21,9 @@ const routeParams = { const studyId = routeParams.studyId; const datasetId = routeParams.datasetId; +const routeState = window.history.state; +const missingFieldsList = (routeState?.missingFields || []).map((f) => f).join(", "); + const formRef = ref(null); const moduleData = reactive({ identifiers: [], @@ -197,6 +200,15 @@ const scrollToSection = (key: string) => {
+
+ + Please fill the following required field(s): + + {{ missingFieldsList }} + + +
+

Primary Identifier

diff --git a/src/views/study/dataset/metadata/related/DatasetMetadataRelatedIdentifiers.vue b/src/views/study/dataset/metadata/related/DatasetMetadataRelatedIdentifiers.vue index a749eb2a..23d82226 100644 --- a/src/views/study/dataset/metadata/related/DatasetMetadataRelatedIdentifiers.vue +++ b/src/views/study/dataset/metadata/related/DatasetMetadataRelatedIdentifiers.vue @@ -22,6 +22,9 @@ const routeParams = { const studyId = routeParams.studyId; const datasetId = routeParams.datasetId; +const routeState = window.history.state; +const missingFieldsList = (routeState?.missingFields || []).map((f) => f).join(", "); + const formRef = ref(null); const moduleData = reactive({ @@ -178,6 +181,15 @@ const saveMetadata = (e: MouseEvent) => { class="pr-4" v-else > +

+ + Please fill the following required field(s): + + {{ missingFieldsList }} + + +
+ f).join(", "); + const formRef = ref(null); const moduleData = reactive({ @@ -375,6 +378,15 @@ const scrollToSection = (key: string) => { class="w-full pr-4" :disabled="studyStore.currentStudyRole === 'viewer'" > +
+ + Please fill the following required field(s): + + {{ missingFieldsList }} + + +
+

Creators

diff --git a/src/views/study/dataset/publish/new/NewVersion.vue b/src/views/study/dataset/publish/new/NewVersion.vue index 755178f9..e590b087 100644 --- a/src/views/study/dataset/publish/new/NewVersion.vue +++ b/src/views/study/dataset/publish/new/NewVersion.vue @@ -2,6 +2,7 @@ import { faker } from "@faker-js/faker"; import { useSidebarStore } from "@/stores/sidebar"; +import type { DatasetMetadataValidation } from "@/types/Dataset"; import { baseURL } from "@/utils/constants"; const route = useRoute(); @@ -17,6 +18,7 @@ const routeParams = { const studyId = routeParams.studyId as string; const datasetId = routeParams.datasetId as string; +const responseLoading = ref(false); const loading = ref(false); @@ -26,6 +28,8 @@ const version = ref({ title: faker.commerce.productName(), }); +const moduleData = reactive([]); + const rules: FormRules = { title: [ { @@ -38,6 +42,31 @@ const rules: FormRules = { onBeforeMount(async () => { sidebarStore.setAppSidebarCollapsed(true); + responseLoading.value = true; + + const response = await fetch( + `${baseURL}/study/${studyId}/dataset/${datasetId}/metadata-validation`, + { + method: "GET", + } + ); + responseLoading.value = false; + + if (!response.ok) { + push.error("Something went wrong."); + + throw new Error("Network response was not ok"); + } + + const data = await response.json(); + + console.log(data); + + moduleData.splice(0, moduleData.length, ...(data ?? []).map((item: any) => ({ ...item }))); + + // + // aboutList = moduleData.map((item: any) => item.about); + // datasetSubjects = moduleData.map((item: any) => item.dataset_subjects); }); const createVersion = (e: MouseEvent) => { @@ -83,6 +112,25 @@ const createVersion = (e: MouseEvent) => { } }); }; + +function uniqueMetadataIdentifiers(fullMetadata: any) { + const uniqueIdentifier = new Set(); + + const uniqueFields = fullMetadata.filter((field: any) => { + const key = field.metadata_header; // or field.field if that's your unique identifier + if (!uniqueIdentifier.has(key)) { + uniqueIdentifier.add(key); + return true; + } + return false; + }); + + return uniqueFields; +} + +function getNamesForHeader(metadata, header) { + return metadata.filter((m) => m.metadata_header === header).map((m) => m.name); +}