Skip to content

Commit

Permalink
MNT merge dev
Browse files Browse the repository at this point in the history
  • Loading branch information
eboileau committed Apr 26, 2024
2 parents 763cfe9 + f844d00 commit 2610bb9
Show file tree
Hide file tree
Showing 34 changed files with 1,777 additions and 303 deletions.
243 changes: 119 additions & 124 deletions client/package-lock.json

Large diffs are not rendered by default.

24 changes: 12 additions & 12 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,31 @@
"format": "prettier --write src/"
},
"dependencies": {
"axios": "^1.6.7",
"axios": "^1.6.8",
"jwt-decode": "^4.0.0",
"pinia": "^2.1.7",
"primeicons": "^6.0.1",
"primevue": "^3.49.1",
"vee-validate": "^4.12.5",
"primeicons": "^7.0.0",
"primevue": "^3.51.0",
"vee-validate": "^4.12.6",
"vite-svg-loader": "^4.0.0",
"vue": "^3.2.47",
"vue-cookies": "^1.8.3",
"vue-cookies": "^1.8.4",
"vue-router": "^4.3.0",
"yup": "^1.4.0"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.7.2",
"@rushstack/eslint-patch": "^1.10.2",
"@vitejs/plugin-vue": "^4.6.2",
"@vue/eslint-config-prettier": "^7.1.0",
"@vue/test-utils": "^2.4.4",
"autoprefixer": "^10.4.18",
"@vue/test-utils": "^2.4.5",
"autoprefixer": "^10.4.19",
"eslint": "^8.57.0",
"eslint-plugin-vue": "^9.22.0",
"eslint-plugin-vue": "^9.25.0",
"jsdom": "^21.1.2",
"postcss": "^8.4.35",
"postcss": "^8.4.38",
"prettier": "^2.8.8",
"tailwindcss": "^3.4.1",
"vite": "^4.5.2",
"tailwindcss": "^3.4.3",
"vite": "^4.5.3",
"vitest": "^0.29.8"
}
}
4 changes: 2 additions & 2 deletions client/src/components/layout/HeaderLayout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,15 @@ function getUserName() {
</div>
<div v-else class="flex flex-wrap 2xl:w-1/5 xl:w-auto 2xl:pl-8 xl:pl-0 gap-4">
<Button
:disabled="true"
:disabled="false"
label="Login"
@click="login()"
icon="pi pi-user"
size="small"
raised
/>
<Button
:disabled="true"
:disabled="false"
label="Sign Up"
@click="signUp()"
icon="pi pi-user-plus"
Expand Down
161 changes: 161 additions & 0 deletions client/src/components/project/ProjectForm.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<script setup>
import { ref, onMounted } from 'vue'
import { useForm, useFieldArray } from 'vee-validate'
import { object, array, string, number, date } from 'yup'
import { HTTPSecure } from '@/services/API'
import FormTextInput from '@/components/ui/FormTextInput.vue'
import FormTextArea from '@/components/ui/FormTextArea.vue'
const props = defineProps(['nextCallback'])
const model = defineModel()
const validationSchema = object({
forename: string().required('Forename is required!'),
surname: string().required('Surname is required!'),
contact_institution: string()
.required('Institution is required!')
.max(255, 'At most 255 characters allowed!'),
contact_email: string()
.required('Email is required!')
.email('Invalid email!')
.max(320, 'At most 320 characters allowed!'),
title: string().required('Title is required!').max(255, 'At most 255 characters allowed!'),
summary: string().required('Summary is required!'),
date_published: date(),
external_sources: array().of(
object().shape({
doi: string().max(255, 'At most 255 characters allowed!'),
pmid: number()
.integer()
.typeError('PMID must be a number!')
.nullable()
.transform((_, val) => (val !== '' ? Number(val) : null))
})
)
})
const getInitialValues = () => {
if (model.value === undefined) {
return null
} else {
return { ...model.value }
}
}
const { defineField, handleSubmit, errors } = useForm({
validationSchema: validationSchema,
initialValues: getInitialValues()
})
const [forename, forenameProps] = defineField('forename')
const [surname, surnameProps] = defineField('surname')
const [contact_institution, institutionProps] = defineField('contact_institution')
const [contact_email, emailProps] = defineField('contact_email')
const [title, titleProps] = defineField('title')
const [summary, summaryProps] = defineField('summary')
const [date_published, publishedProps] = defineField('date_published')
const { remove, push, fields } = useFieldArray('external_sources')
const onSubmit = handleSubmit((values) => {
model.value = values
props.nextCallback()
})
onMounted(() => {
HTTPSecure.get('/access/username')
.then((response) => {
contact_email.value = response.data.username
})
.catch((err) => {
// console.log(err.response.status)
console.log(err)
// on error what to do
})
})
</script>

<template>
<SectionLayout>
<div>
<form @submit.prevent="onSubmit">
<div class="flex flex-col mx-auto">
<div class="text-center -mt-4 mb-4 text-xl font-semibold dark:text-white/80">
Project information
</div>
</div>
<h3 class="mb-4 dark:text-white/80">Your contact details</h3>
<div class="grid grid-cols-2 gap-y-2 gap-x-8">
<FormTextInput v-model="forename" :error="errors.forename" placeholder="Forename"
>Forename</FormTextInput
>
<FormTextInput v-model="surname" :error="errors.surname" placeholder="Surname"
>Surname (family name)</FormTextInput
>
<FormTextInput
v-model="contact_institution"
:error="errors.contact_institution"
placeholder="University of ..."
>Institution</FormTextInput
>
<FormTextInput v-model="contact_email" :error="errors.contact_email"
>Email address</FormTextInput
>
</div>
<h3 class="mt-2 mb-4 dark:text-white/80">Project details</h3>
<div class="grid grid-rows-3 gap-2">
<FormTextInput
v-model="title"
:error="errors.title"
placeholder="Transcriptome-wide profiling ..."
>Title</FormTextInput
>
<FormTextArea
v-model="summary"
:error="errors.summary"
placeholder="Profiling with technique T at site-specific resolution in human cell lines X, Y, Z under conditions A and B, etc."
>
Summary (project description)
</FormTextArea>
<FormTextInput v-model="date_published" :error="errors.date_published" type="date"
>Date published (add if published)</FormTextInput
>
</div>
<h3 class="dark:text-white/80">Published project sources.</h3>
<h3 class="mb-4 dark:text-white/80">
Click <span class="inline font-semibold">"Add source"</span> to add DOI and/or PubMed-ID.
Add as many as required. DOI or PubMed-ID can be empty.
</h3>
<Button @click="push({ doi: '', pmid: '' })" label="Add source" class="mt-2 mb-4" />
<div class="grid grid-cols-3 gap-4 mt-2" v-for="(field, idx) in fields" :key="field.key">
<FormTextInput
v-model="field.value.doi"
:error="errors[`external_sources[${idx}].doi`]"
placeholder="10.XXXX/..."
>DOI</FormTextInput
>
<FormTextInput
v-model="field.value.pmid"
:error="errors[`external_sources[${idx}].pmid`]"
placeholder="PubMed-ID"
>PMID</FormTextInput
>
<div class="place-self-start self-center">
<Button @click="remove(idx)" label="Remove" />
</div>
</div>

<br />
<div class="flex pt-4 justify-end">
<Button
type="submit"
label="Next"
icon="pi pi-arrow-right"
iconPos="right"
class="p-4 text-primary-50 border border-white-alpha-30"
>
</Button>
</div>
</form>
</div>
</SectionLayout>
</template>
69 changes: 69 additions & 0 deletions client/src/components/project/ProjectList.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<script setup>
import { ref, inject, onMounted } from 'vue'
import { HTTP } from '@/services/API.js'
const dialogRef = inject('dialogRef')
const records = ref()
const splitStr = (str) => {
return str.split(',')
}
onMounted(() => {
HTTP.get('/smid')
.then(function (response) {
records.value = response.data
})
.catch((error) => {
console.log(error)
})
})
function selectProject(data) {
console.log('DATA', data)
dialogRef.value.close(data)
}
</script>

<template>
<DataTable :value="records">
<Column style="width: 5rem" header="Select">
<template #body="slotProps">
<Button
icon="pi pi-plus"
outlined
rounded
severity="secondary"
@click="selectProject(slotProps.data)"
></Button>
</template>
</Column>
<Column field="id" header="SMID"></Column>
<Column field="title" header="Title"></Column>
<Column field="summary" header="Summary"></Column>
<Column field="date_added" header="Added"></Column>
<Column field="contact_name" header="Contact"></Column>
<Column field="contact_institution" header="Institution"></Column>
<Column field="doi" header="DOI">
<template #body="{ data }">
<ul class="list-none" v-for="doi in splitStr(data.doi)">
<a class="text-secondary-500 pr-12" target="_blank" :href="`https://doi.org/${doi}`">{{
doi
}}</a>
</ul>
</template>
</Column>
<Column field="pmid" header="PMID">
<template #body="{ data }">
<ul class="list-none" v-for="pmid in splitStr(data.pmid)">
<a
class="text-secondary-500"
target="_blank"
:href="`http://www.ncbi.nlm.nih.gov/pubmed/${pmid}`"
>{{ pmid }}</a
>
</ul>
</template>
</Column>
</DataTable>
</template>
Loading

0 comments on commit 2610bb9

Please sign in to comment.