Newer
Older
<template>
<div>
<div class="flex items-center justify-center">
<h3 v-show="error" class="text-2xl text-red-500">{{ errorMsg }}</h3>
<div v-if="item === 'new' || loaded" class="md:flex card p-2 mt-5">
<div class="p-5 mx-auto text-left font-raleway container max-w-screen-md">
<h1 class="font-bold text-left font-montserrat text-3xl sm:text-5xl mb-7">
{{ item === 'new'? 'Create new Update Item' : item }}
<form @submit="update" class="w-full md:w-auto">
<div class="md:flex md:items-center mx-3 mb-6">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-entity-type">
Entity Type
</label>
</div>
<div class="md:w-2/3">
<select v-model="entity" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-entity-type" >
<option disabled value="">Please select one</option>
<option>protein</option>
<option>condensate</option>
<option>condensate_protein</option>
</select>
</div>
</div>
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-entity-id">
Entity ID
</label>
</div>
<div class="md:w-2/3">
<input v-model="entityId" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-entity-id" type="text" placeholder="UNE6">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-change-operation">
Change Operation
</label>
</div>
<div class="md:w-2/3">
<select v-model="changeOperation" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-change-operation" >
<option disabled value="">Please select one</option>
<option>add</option>
<option>remove</option>
<option>update</option>
</select>
</div>
</div>
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-attribute-name">
Attribute Name
</label>
</div>
<div class="md:w-2/3">
<input v-model="attribute" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-attribute-name" type="text" placeholder="functional_type">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-attribute-value">
Attribute Value
</label>
</div>
<div class="md:w-2/3">
<input v-model="attributeValue" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-attribute-value" type="text" placeholder="driver">
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-comment">
<input v-model="submissionComments" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-comment" type="text" placeholder="your comments here">
<div v-if="item !== 'new'" class="md:flex md:items-center mx-3 mb-6">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-status">
Status
</label>
</div>
<div class="md:w-2/3">
<p v-if="(userRole === 'Contributor' || userRole === 'Maintainer' || userRole === 'Administrator') && itemId !== 'new'" class="mt-3">
{{status}}
<div v-if="item !== 'new'" class="md:flex md:items-center mx-3 mb-6">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-reviewer-comment">
Reviewer Comments
</label>
</div>
<div class="md:w-2/3">
<p v-if="(userRole === 'Contributor' || userRole === 'Maintainer' || userRole === 'Administrator') && itemId !== 'new'" class="mt-3">
{{reviewComments}}
</p>
</div>
</div>
<button type="submit" :disabled="entityId.length < 3" class="bg-green-400 p-5 text-white">
{{ item === 'new'? 'Submit' : 'Update' }} <span class="fa fa-arrow-right"/>
<div v-if="(userRole === 'Maintainer' || userRole === 'Administrator') && item !== 'new'" class="mt-10">
<hr/>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-status">
Status
</label>
</div>
<div class="md:w-2/3">
<select v-model="status" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-status" >
<option disabled value="">Please select one</option>
<option>requested</option>
<option>accepted</option>
<option>rejected</option>
<option>synced</option>
</select>
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-reviewer-comment">
Reviewer Comment
</label>
</div>
<div class="md:w-2/3">
<input v-model="reviewComments" class="bg-white w-full py-2 text-gray-700 outline-none bg-transparent border-b hover:border-blue-700 focus:bg-gray-200 focus:border-blue-700" id="inline-reviewer-comment" type="text" placeholder="reviewer comments here">
</div>
</div>
<div class="md:flex md:items-center mx-3 mb-6">
<div class="md:w-1/3">
<label class="text-left font-bold md:text-right mb-1 md:mb-0 pr-4" for="inline-reviewer-comment">
Sync Response
</label>
</div>
<div class="md:w-2/3">
<p class="mt-3">
{{syncResponse}}
</p>
</div>
</div>
<button type="button" :disabled="entityId.length < 3" class="bg-green-400 p-5 text-white" @click="updateReview">
{{ 'Update Review' }} <span class="fa fa-arrow-right"/>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
let host = require('@/components/js/const').apiHost;
name: 'UpdateItem',
props: ['itemId'],
data() {
return {
item: this.$route.params.item ? this.$route.params.item : this.itemId,
entity: 'protein', // [protein, condensate, condensate_protein]
entityId: '', // protein: <uniprot_id>, condensate: <canonical_id>, condensate_protein: <uniprot_id>==<canonical_id>
changeOperation: 'add', // add/remove/update/update_add/update_remove
attribute: '', // protein: functional_type[driver/client/regulator], pubmed_ids[]
// condensate: description, proteins
// condensate_protein: confidence_score, pubmed_ids
attributeValue: '', // the value of the attribute to be updated. Could be "null" for add/remove operations. The data type is dynamic
status: 'requested', // 1. requested, 2. accepted, 3. rejected, 4. synced
submittedBy: '',
submittedAt: '', // datetime
submissionComments: '',
reviewedBy: '',
reviewedAt: '', // datetime
reviewComments: '',
syncedAt: '', // datetime
syncResponse: '', // response from the sync process (errors if any)
errorMsg: `An error occurred, please try again`,
isDev: process.env.NODE_ENV === 'development',
}
},
computed: {
jwt: function () {
return this.$store.getters['User/jwt']
},
userData: function () {
return this.$store.getters['User/userData']
},
userRole: function () {
return this.$store.getters['User/userRole']
},
},
methods: {
async update(e) {
e.preventDefault()
const vm = this;
if(vm.isDev) {
host = require('@/components/js/const').devApiHost;
}
if(jwt === null) {
return
}
// console.log(vm.userData)
let dat = {
Entity: this.entity,
EntityId: this.entityId,
Attribute: this.attribute,
Value: this.attributeValue,
ChangeOperation: this.changeOperation,
SubmissionComments: this.submissionComments,
Status: vm.userRole === 'Maintainer' ? 'accepted' : this.status,
// ReviewedBy:
// ReviewedAt:
// ReviewComment:
// SyncedAt:
// SyncResponse:
};
try {
if(vm.item !== 'new') {
const res = await this.axios.put(`${host}/api/update-items/` + vm.item, {
data: dat,
}, {
headers: {
Authorization: `Bearer ${jwt}`
}
const res = await this.axios.post(`${host}/api/update-items`, {
data: dat,
}, {
headers: {
Authorization: `Bearer ${jwt}`
}
}
// console.log(res)
vm.$router.push('/profile')
} catch(error) {
// console.log(error.response.data.error.message)
this.error = true
this.errorMsg = error
}
},
async load(id) {
const vm = this;
if(vm.isDev) {
host = require('@/components/js/const').devApiHost;
}
if(jwt === null) {
return
}
// console.log(vm.userData)
try {
const res = await this.axios.get(`${host}/api/update-items/` + id, {
headers: {
Authorization: `Bearer ${jwt}`
}
if(res.data.data) {
const d = res.data.data.attributes;
vm.item = res.data.data.id;
vm.entity = d.Entity;
vm.entityId = d.EntityId;
vm.attribute = d.Attribute;
vm.attributeValue = d.Value;
vm.changeOperation = d.ChangeOperation;
vm.status = d.Status;
vm.submissionComments = d.SubmissionComments;
vm.reviewComments = d.ReviewComments;
vm.reviewedBy = d.reviewedBy;
vm.reviewedAt = d.ReviewedAt;
// ReviewedBy:
// ReviewedAt:
// ReviewComment:
// SyncedAt:
// SyncResponse:
}
} catch(error) {
this.error = true
this.errorMsg = "You are not authorized to access this item."
setTimeout(() => vm.$router.go(-1), 2000);
},
async updateReview() {
const vm = this;
if(vm.isDev) {
host = require('@/components/js/const').devApiHost;
}
const jwt = vm.jwt;
if(jwt === null) {
vm.loaded = false;
return
}
// console.log(vm.userData)
let dat = {
Status: this.status,
ReviewComments: this.reviewComments,
ReviewedAt: this.reviewedAt
await this.axios.put(`${host}/api/update-item/review/` + vm.item, {
data: dat,
}, {
headers: {
Authorization: `Bearer ${jwt}`
}
// console.log(res)
vm.$router.go(-1)
} catch(error) {
// console.log(error.response.data.error.message)
// console.log(error.response)
this.error = true
this.errorMsg = error
},
mounted: function () {
const vm = this;
const jwt = vm.jwt;
if(jwt === null) {
vm.$router.push('/login')
if(vm.item !== 'new') {
vm.load(vm.item)
}
}
@import url('~@/assets/bootstrap.css');
a {
color: #42b983;
}
</style>