Skip to content
Snippets Groups Projects
UpdateItem.vue 11.2 KiB
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="loaded" class="md:flex card p-2 mt-5">
moon's avatar
moon committed
        <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 }}
          </h1>
moon's avatar
moon committed
          <form @submit="update" class="w-full md:w-auto">
            <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-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>

moon's avatar
moon committed
            <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-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">
              </div>
            </div>

moon's avatar
moon committed
            <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-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_Add</option>
                  <option>Update_Remove</option>
                </select>
              </div>
            </div>

moon's avatar
moon committed
            <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-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">
              </div>
            </div>

moon's avatar
moon committed
            <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-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>
            </div>

moon's avatar
moon committed
            <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">
                  Comment
                </label>
              </div>
              <div class="md:w-2/3">
                <input v-model="comment" 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>
            </div>

            <div v-if="item !== 'new'" 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">
moon's avatar
moon committed
                <select v-if="userRole === 'Maintainer' || userRole === 'Administrator'" 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>Partially_Accepted</option>
                  <option>Synced</option>
                </select>
moon's avatar
moon committed
                <p v-if="userRole === 'Contributor' && itemId !== 'new'" class="mt-3">
                  {{status}}
                </p>
moon's avatar
moon committed
            <div v-if="item !== 'new'" 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-if="userRole === 'Maintainer' || userRole === 'Administrator'" v-model="reviewComment" 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">
moon's avatar
moon committed
                <p v-if="userRole === 'Contributor' && itemId !== 'new'" class="mt-3">
                  {{reviewComment}}
                </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"/>
            </button>
          </form>
        </div>
      </div>
    </div>
  </div>
</template>
<script>

export default {
  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. Patially_Accepted, 5. Synced
      submittedBy: '',
      submittedAt: '', // datetime
      submissionComment: '',
      reviewedBy: '',
      reviewedAt: '', // datetime
      reviewComment: '',
      syncedAt: '', // datetime
      syncResponse: '', // response from the sync process (errors if any)
      comment: '', // user comment
      loaded: false,
      error: false,
      errorMsg: `An error occurred, please try again`
    }
  },
  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) {
      const vm = this;
      e.preventDefault()

      const jwt = vm.jwt;
      if(jwt === null) {
        vm.loaded = false;
        return
      }

      // console.log(vm.userData)
      let dat = {
        ResourceName: this.entity,
        ResourceID: this.entityId,
        DataAttribute: this.attribute,
        DataAttributeValue: this.attributeValue,
        ChangeOperation: this.changeOperation,
        UserComment: this.comment,
        ReviewComment: this.reviewComment,
        // ReviewedBy:
        // ReviewedAt:
        // ReviewComment:
        // SyncedAt:
        // SyncResponse:
      };

      try {
        if(vm.item !== 'new') {
          const res = await this.axios.put(`http://localhost:1337/api/update-items/` + vm.item, {
            data: dat,
          }, {
            headers: {
              Authorization: `Bearer ${jwt}`
            }
          });
        } else {
          const res = await this.axios.post(`http://localhost:1337/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)
        // console.log(error.response)
        this.error = true
        this.errorMsg = error
      }
    },
    async load(id) {
      const vm = this;

      const jwt = vm.jwt;
      if(jwt === null) {
        vm.loaded = false;
        return
      }

      // console.log(vm.userData)

      try {
        const res = await this.axios.get(`http://localhost:1337/api/update-items/` + id, {
          headers: {
            Authorization: `Bearer ${jwt}`
          }
        });

        // console.log(res)

        if(res.data.data) {
          const d = res.data.data.attributes;
          vm.item = res.data.data.id;
          vm.entity = d.ResourceName;
          vm.entityId = d.ResourceID;
          vm.attribute = d.DataAttribute;
          vm.attributeValue = d.DataAttributeValue;
          vm.changeOperation = d.ChangeOperation;
          vm.comment = d.UserComment;
          vm.reviewComment = d.reviewComment;
          // ReviewedBy:
          // ReviewedAt:
          // ReviewComment:
          // SyncedAt:
          // SyncResponse:
        }

        vm.loaded = true;
      } catch(error) {
        // console.error(error)
        this.error = true
        this.errorMsg = "You are not authorized to access this item."
        setTimeout(() => vm.$router.go(-1), 2000);
      }
    }
  },
  mounted: function () {
    const vm = this;

    const jwt = vm.jwt;
    if(jwt === null) {
      vm.$router.push('/login')
    } else {
      if(vm.item !== 'new') {
        vm.load(vm.item)
      }
moon's avatar
moon committed
    }
  }
}
</script>
<style>
@import url('~@/assets/bootstrap.css');

a {
  color: #42b983;
}
</style>