From 10a2b27843161b8ad7b2a0e575086e891e521b20 Mon Sep 17 00:00:00 2001 From: raghosh <raghosh@loaner-laptop-13.local> Date: Wed, 18 May 2022 16:43:57 +0200 Subject: [PATCH] Working on request actions of Novel Condensate. --- web/src/components/LlpsTable.vue | 341 ++++++++++-------- .../components/NovelCondensateRequests.vue | 314 ++++++++++++++++ web/src/components/js/const.js | 12 +- web/src/views/NovelCondensate.vue | 305 ++++++++++++++++ web/src/views/UpdateItem.vue | 307 ++++++++-------- web/src/views/UpdateItems.vue | 36 +- 6 files changed, 981 insertions(+), 334 deletions(-) create mode 100644 web/src/components/NovelCondensateRequests.vue create mode 100644 web/src/views/NovelCondensate.vue diff --git a/web/src/components/LlpsTable.vue b/web/src/components/LlpsTable.vue index ba054fc..8a42209 100644 --- a/web/src/components/LlpsTable.vue +++ b/web/src/components/LlpsTable.vue @@ -5,7 +5,7 @@ <table :id="id" class="table table-striped table-bordered table-hover" - style="width:100%" + style="width: 100%" /> <the-action-modal @@ -31,30 +31,30 @@ </template> <script> -import TheActionModal from './UI/TheActionModal.vue'; -import TheDeleteModal from './UI/TheDeleteModal.vue'; -import {apikey} from '@/components/js/const'; +import TheActionModal from "./UI/TheActionModal.vue"; +import TheDeleteModal from "./UI/TheDeleteModal.vue"; +import { apikey } from "@/components/js/const"; -const _ = require('lodash'); -const $ = (window.jQuery = require('jquery')); -require('./js/clipboard'); -require('@/components/js/datatable'); +const _ = require("lodash"); +const $ = (window.jQuery = require("jquery")); +require("./js/clipboard"); +require("@/components/js/datatable"); let table; const scoreMap = { - 'http://llps.biocuckoo.cn/': 1, - 'http://db.phasep.pro/browse/highthroughput/': 2, - 'http://db.phasep.pro/browse/reviewed/': 4, - 'http://db.phasep.pro/browse/uniprotreviewed/': 4, - 'http://bio-comp.org.cn/llpsdb/': 4, - 'https://phasepro.elte.hu/': 4, - 'https://pubmed.ncbi.nlm.nih.gov/': 4, - 'https://cd-code.org/': 5, + "http://llps.biocuckoo.cn/": 1, + "http://db.phasep.pro/browse/highthroughput/": 2, + "http://db.phasep.pro/browse/reviewed/": 4, + "http://db.phasep.pro/browse/uniprotreviewed/": 4, + "http://bio-comp.org.cn/llpsdb/": 4, + "https://phasepro.elte.hu/": 4, + "https://pubmed.ncbi.nlm.nih.gov/": 4, + "https://cd-code.org/": 5, }; function getStartWith(url) { - let ret = ''; + let ret = ""; _.forEach(_.keys(scoreMap), (i) => { if (url.startsWith(i)) { ret = i; @@ -79,39 +79,39 @@ function getRating(data) { } } - r.push('</div>'); + r.push("</div>"); return r; } export default { - name: 'LlpsTable', + name: "LlpsTable", components: { TheActionModal, TheDeleteModal, }, props: [ - 'id', - 'data', - 'map', - 'pubmed', - 'dbTags', - 'isExperimental', - 'canonicalId', - 'proteinDriverCriterion', - 'proteinExperimentalEvidence', - 'proteinFunctionalType', + "id", + "data", + "map", + "pubmed", + "dbTags", + "isExperimental", + "canonicalId", + "proteinDriverCriterion", + "proteinExperimentalEvidence", + "proteinFunctionalType", ], data() { return { toggleActionModal: false, toggleDeleteModal: false, - uniprotId: '', - selectedRowData: '', - canonicaliD: '', + uniprotId: "", + selectedRowData: "", + canonicaliD: "", proteinConfidenceScore: 0, - proteinFunctionalTypeData: '', - proteinExperimentalEvidenceData: '', - proteinDriverCriterionData: '', + proteinFunctionalTypeData: "", + proteinExperimentalEvidenceData: "", + proteinDriverCriterionData: "", }; }, mounted() { @@ -122,11 +122,11 @@ export default { methods: { closeModal() { this.toggleActionModal = false; - this.$emit('update-key'); + this.$emit("update-key"); }, closeDeleteModal() { this.toggleDeleteModal = false; - this.$emit('update-key'); + this.$emit("update-key"); }, fetchProtein(uniprot_id) { const vm = this; @@ -136,7 +136,7 @@ export default { // console.log(url) // this.$router.push(url) // window.open(url); - vm.$router.push(url) + vm.$router.push(url); }, forwardUniprot(uniprot_id) { const vm = this; @@ -145,7 +145,7 @@ export default { // // eslint-disable-next-line // console.log(url) // window.open(url); - vm.$router.push(url) + vm.$router.push(url); }, createLink(link) { return `<a href="${link}" class="external-link tooltipped tooltipped-n tooltipped-multiline" @@ -163,15 +163,15 @@ export default { // console.log(item) if (item) { const url = - 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&retmode=json&id='; + "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&retmode=json&id="; const request = url + item; - let $row = $('#' + item); + let $row = $("#" + item); - if (!$row.attr('aria-label')) { + if (!$row.attr("aria-label")) { fetch(request, { - method : 'GET', - mode: 'cors', - headers: {} + method: "GET", + mode: "cors", + headers: {}, }) .then((response) => response.json()) .then((response) => { @@ -180,9 +180,9 @@ export default { $(`a[id="${item}"]`).each(function () { $(this).attr( - 'aria-label', + "aria-label", `${res.title}\n\n${_.map(res.authors, (a) => a.name).join( - ', ' + ", " )}` ); }); @@ -201,16 +201,16 @@ export default { const columns = vm.isExperimental ? [ { - title: 'UniProt', - data: 'uniprot_id', - className: 'text-nowrap', + title: "UniProt", + data: "uniprot_id", + className: "text-nowrap", fnCreatedCell: (nTd, sData, oData) => { $(nTd).html(`<a href="" class="protein-link"> ${sData} </a>`); }, }, { - title: 'Gene Name', - data: 'gene_name', + title: "Gene Name", + data: "gene_name", fnCreatedCell: (nTd, sData, oData) => { if (sData) { $(nTd).html(`<a href="" class="protein-link"> ${sData}</a>`); @@ -220,8 +220,8 @@ export default { }, }, { - title: 'Name', - data: 'name', + title: "Name", + data: "name", fnCreatedCell: (nTd, sData, oData) => { if (sData) { $(nTd).html(`<a href="" class="protein-link"> ${sData}</a>`); @@ -266,36 +266,37 @@ export default { // } // }, { - title: 'Pubmed', - data: 'uniprot_id', - className: 'text-nowrap', + title: "Pubmed", + data: "uniprot_id", + className: "text-nowrap", render: function (data, type, row, meta) { if (vm.pubmed) { let dat = vm.pubmed[row.uniprot_id]; if (dat) { - return dat.join(', '); + return dat.join(", "); } else { - return ''; + return ""; } } else { - return ''; + return ""; } }, fnCreatedCell: (nTd, sData, oData) => { // console.log(sData) if (vm.pubmed) { let data = vm.pubmed[oData.uniprot_id]; + if (data) { // $(nTd).html(data.filter(a => a.startsWith('http')).join('\n')); // $(nTd).html(data.map(i => vm.createLink(i)).join('<br/>')); $(nTd).html( - data.map((i) => vm.createPubMedLink(i)).join(' ') + data.map((i) => vm.createPubMedLink(i)).join(" ") ); } else { - $(nTd).html(''); + $(nTd).html(""); } } else { - $(nTd).html(''); + $(nTd).html(""); } }, }, @@ -385,22 +386,22 @@ export default { // }, // } { - title: 'Confidence Score', - className: 'text-nowrap', - data: 'uniprot_id', + title: "Confidence Score", + className: "text-nowrap", + data: "uniprot_id", render: function (data, type, row, meta) { // console.log(_.flatMap(row.condensates, c => c.data_sources)) let dat = vm.map[row.uniprot_id]; if (dat) { return dat; } - return ''; + return ""; }, fnCreatedCell: (nTd, sData, oData) => { // console.log(sData) let data = vm.map[oData.uniprot_id]; if (data) { - $(nTd).html(getRating(data).join('\n')); + $(nTd).html(getRating(data).join("\n")); } }, }, @@ -434,17 +435,17 @@ export default { ] : [ { - title: 'UniProt', - data: 'uniprot_id', - className: 'whitespace-normal', + title: "UniProt", + data: "uniprot_id", + className: "whitespace-normal", fnCreatedCell: (nTd, sData, oData) => { $(nTd).html(`<a href="" class="protein-link"> ${sData} </a>`); }, }, { - title: 'Gene Name', - data: 'gene_name', - className: 'whitespace-normal', + title: "Gene Name", + data: "gene_name", + className: "whitespace-normal", fnCreatedCell: (nTd, sData, oData) => { if (sData) { $(nTd).html(`<a href="" class="protein-link"> ${sData}</a>`); @@ -454,9 +455,9 @@ export default { }, }, { - title: 'Name', - data: 'name', - className: 'whitespace-normal break-all', + title: "Name", + data: "name", + className: "whitespace-normal break-all", fnCreatedCell: (nTd, sData, oData) => { if (sData) { $(nTd).html(`<a href="" class="protein-link"> ${sData}</a>`); @@ -484,19 +485,20 @@ export default { // } // }, { - title: 'Pubmed', - data: 'uniprot_id', - className: 'whitespace-normal', + title: "Pubmed", + data: "uniprot_id", + className: "whitespace-normal", render: function (data, type, row, meta) { if (vm.pubmed) { let dat = vm.pubmed[row.uniprot_id]; + console.log("lpps data", dat); if (dat) { - return dat.join(', '); + return dat.join(", "); } else { - return ''; + return ""; } } else { - return ''; + return ""; } }, fnCreatedCell: (nTd, sData, oData) => { @@ -507,21 +509,21 @@ export default { // $(nTd).html(data.filter(a => a.startsWith('http')).join('\n')); // $(nTd).html(data.map(i => vm.createLink(i)).join('<br/>')); $(nTd).html( - data.map((i) => vm.createPubMedLink(i)).join(' ') + data.map((i) => vm.createPubMedLink(i)).join(" ") ); } else { - $(nTd).html(''); + $(nTd).html(""); } } else { - $(nTd).html(''); + $(nTd).html(""); } }, }, { - title: 'Functional Type', - data: 'protein_functional_type', - className: 'whitespace-nowrap', - + title: "Functional Type", + data: "protein_functional_type", + className: "whitespace-nowrap", + render: function (data, type, row, meta) { // console.log(_.flatMap(row.condensates, c => c.data_sources)) if (!vm.proteinFunctionalType) { @@ -531,15 +533,15 @@ export default { if (dat) { return _.startCase(dat); } else { - return ''; + return ""; } }, }, { - title: 'Experimental Evidence', - data: 'protein_exp_evidence', - className: 'whitespace-normal', - + title: "Experimental Evidence", + data: "protein_exp_evidence", + className: "whitespace-normal", + render: function (data, type, row, meta) { // console.log(_.flatMap(row.condensates, c => c.data_sources)) if (!vm.proteinExperimentalEvidence) { @@ -548,18 +550,20 @@ export default { let dat = vm.proteinExperimentalEvidence[row.uniprot_id]; if (dat) { - const val= dat.map(i=> i==='frap'? dat[i]=i.toUpperCase() : _.startCase(i)) - - return val.join(', '); + const val = dat.map((i) => + i === "frap" ? (dat[i] = i.toUpperCase()) : _.startCase(i) + ); + + return val.join(", "); } - return ''; + return ""; }, }, { - title: 'Driver Criterion', - data: 'driver_criterion', - className: 'whitespace-normal', - + title: "Driver Criterion", + data: "driver_criterion", + className: "whitespace-normal", + render: function (data, type, row, meta) { // console.log(_.flatMap(row.condensates, c => c.data_sources)) if (!vm.proteinDriverCriterion) { @@ -567,12 +571,13 @@ export default { } let dat = vm.proteinDriverCriterion[row.uniprot_id]; if (dat) { - - const val= dat.map(i=> i==='self_ps'? dat[i]='Self-PS': _.startCase(i)) - - return val.join(', '); + const val = dat.map((i) => + i === "self_ps" ? (dat[i] = "Self-PS") : _.startCase(i) + ); + + return val.join(", "); } - return ''; + return ""; }, }, // { @@ -606,10 +611,10 @@ export default { // }, // } { - title: 'Confidence Score', - className: 'whitespace-nowrap', - data: 'uniprot_id', - name: 'confidenceScore', + title: "Confidence Score", + className: "whitespace-nowrap", + data: "uniprot_id", + name: "confidenceScore", render: function (data, type, row, meta) { // console.log(_.flatMap(row.condensates, c => c.data_sources)) let dat = vm.map[row.uniprot_id]; @@ -617,20 +622,20 @@ export default { // console.log(getRatingValue(vm.map[row.uniprot_id])) return dat; } - return ''; + return ""; }, fnCreatedCell: (nTd, sData, oData) => { let data = vm.map[oData.uniprot_id]; if (data) { - $(nTd).html(getRating(data).join('\n')); + $(nTd).html(getRating(data).join("\n")); } }, }, { - title: 'Action', - data: 'uniprot_id', - name: 'action', - className: 'text-nowrap', + title: "Action", + data: "uniprot_id", + name: "action", + className: "text-nowrap", fnCreatedCell: (nTd, sData, oData) => { $(nTd).html( `<button class="rounded-md bg-transparent hover:bg-blue-500 text-blue-700 @@ -680,7 +685,7 @@ export default { // aaSorting: [[ 0, 'asc' ]], lengthMenu: [ [10, 25, 50, -1], - [10, 25, 50, 'All'], + [10, 25, 50, "All"], ], paging: true, searching: true, @@ -689,7 +694,7 @@ export default { order: [], // order: [[0, 'asc']], bDestroy: true, // Add this property to new setting, oLanguage: { - sSearch: 'Filter', + sSearch: "Filter", }, dom: '<"row"<"col-sm-2"l><"col-sm-2"f><"col-sm-6"p><"#download.col-sm-2">><"row"t><"row"<"col-sm-4"i><"col-sm-8"p>>', // initComplete: function () { @@ -723,20 +728,22 @@ export default { table = $(tableId).DataTable(nTableOptions); - $('#download').html('<div style="text-align: right;"><div class="dropdown">\n' + - ' <button class="btn download-link" type="button" id="dropdownMenuButton">\n' + - ' Download CSV\n' + - ' </button>\n' + - '</div></div>'); + $("#download").html( + '<div style="text-align: right;"><div class="dropdown">\n' + + ' <button class="btn download-link" type="button" id="dropdownMenuButton">\n' + + " Download CSV\n" + + " </button>\n" + + "</div></div>" + ); if ( - !this.$store.getters['User/userRole'] || - this.$store.getters['User/userRole'] === 'Administrator' || - this.$store.getters['User/userRole'] === 'Authenticated' + !this.$store.getters["User/userRole"] || + this.$store.getters["User/userRole"] === "Administrator" || + this.$store.getters["User/userRole"] === "Authenticated" ) { var colIndex; table.columns().every(function () { - colIndex = table.column('action:name').index(); + colIndex = table.column("action:name").index(); // ... do something with data(), or this.nodes(), etc }); @@ -745,20 +752,20 @@ export default { const tableBody = `${tableId} tbody`; - $(tableBody).on('click', 'tr td a.protein-link', (e) => { + $(tableBody).on("click", "tr td a.protein-link", (e) => { e.preventDefault(); const tr = $(e.target).parent().parent(); const row = table.row(tr); vm.fetchProtein(row.data().uniprot_id); }); - $(tableBody).on('click', 'tr td a.uniprot-link', (e) => { + $(tableBody).on("click", "tr td a.uniprot-link", (e) => { e.preventDefault(); const tr = $(e.target).parent().parent(); const row = table.row(tr); vm.forwardUniprot(row.data().uniprot_id); }); - $(tableBody).on('click', 'tr td button.edit-link', (e) => { + $(tableBody).on("click", "tr td button.edit-link", (e) => { e.preventDefault(); const tr = $(e.target).parent().parent(); @@ -789,7 +796,7 @@ export default { proteinDriCri = vm.proteinDriverCriterion[driverCri]; } } - + vm.proteinFunctionalTypeData = findProteinFunctionalType; vm.proteinExperimentalEvidenceData = proteinExpEvi; vm.proteinDriverCriterionData = proteinDriCri; @@ -802,24 +809,24 @@ export default { // vm.$router.push(`/protein/editDetails/${id}`); // vm.fetchPubMedId(e.target.id); }); - $(tableBody).on('click', 'tr td button.delete-link', (e) => { + $(tableBody).on("click", "tr td button.delete-link", (e) => { e.preventDefault(); const tr = $(e.target).parent().parent(); const row = table.row(tr); const id = row.data().uniprot_id; vm.uniprotId = id; - + vm.toggleDeleteModal = true; // vm.$router.push(`/protein/editDetails/${id}`); // vm.fetchPubMedId(e.target.id); }); - $(tableBody).on('mouseover', 'tr td a.pubmed-link', (e) => { + $(tableBody).on("mouseover", "tr td a.pubmed-link", (e) => { e.preventDefault(); // console.log(e.target.id) vm.fetchPubMedId(e.target.id); }); - $('#download').on('click', (e) => { + $("#download").on("click", (e) => { e.preventDefault(); vm.downloadCsv(); }); @@ -827,19 +834,27 @@ export default { async downloadCsv() { const vm = this; if (vm.data) { - - console.log(vm.data) + console.log(vm.data); const data = vm.data; let exports = []; - let header = ['UniProt', 'Gene Name', 'Name', 'Pubmed', 'Functional Type', 'Experimental Evidence', 'Driver Criterion', 'DB', 'Confidence Score']; - - exports.push(header.join(', ')); - - _.forEach(data, item => { - + let header = [ + "UniProt", + "Gene Name", + "Name", + "Pubmed", + "Functional Type", + "Experimental Evidence", + "Driver Criterion", + "DB", + "Confidence Score", + ]; + + exports.push(header.join(", ")); + + _.forEach(data, (item) => { let pubMedIds = []; if (vm.pubmed) { let pubMedId = vm.pubmed[item.uniprot_id]; @@ -879,22 +894,35 @@ export default { let dbTags; if (vm.dbTags) { let dat = vm.dbTags[id]; - dbTags = dat.join('\t'); + dbTags = dat.join("\t"); } - exports.push([`"${item.uniprot_id}"`, `"${item.gene_name}"`, `"${item.name}"`, `"${pubMedIds.join('\t')}"`, findProteinFunctionalType, proteinExpEvi, proteinDriCri, dbTags, findScore].join(',')); - }) + exports.push( + [ + `"${item.uniprot_id}"`, + `"${item.gene_name}"`, + `"${item.name}"`, + `"${pubMedIds.join("\t")}"`, + findProteinFunctionalType, + proteinExpEvi, + proteinDriCri, + dbTags, + findScore, + ].join(",") + ); + }); - let blob = new Blob([exports.join('\n')], {type: 'text/csv'}) + let blob = new Blob([exports.join("\n")], { type: "text/csv" }); - let contentDisposition = 'Content-Disposition: attachment; filename="download-data.csv"' - let filename = contentDisposition.split('filename=')[1] - filename = filename.replace(/"/g, '') + let contentDisposition = + 'Content-Disposition: attachment; filename="download-data.csv"'; + let filename = contentDisposition.split("filename=")[1]; + filename = filename.replace(/"/g, ""); - let link = vm.$refs.download - link.href = window.URL.createObjectURL(blob) - link.download = filename - link.click() + let link = vm.$refs.download; + link.href = window.URL.createObjectURL(blob); + link.download = filename; + link.click(); } }, }, @@ -963,7 +991,6 @@ ul.pagination { border-color: #30546b; } - .link { color: #ef0087 !important; } diff --git a/web/src/components/NovelCondensateRequests.vue b/web/src/components/NovelCondensateRequests.vue new file mode 100644 index 0000000..6831b67 --- /dev/null +++ b/web/src/components/NovelCondensateRequests.vue @@ -0,0 +1,314 @@ +<template> + <section> + <table + :id="id" + class="table table-striped table-bordered table-hover" + style="width: 100%" + ></table> + </section> +</template> + +<script> +const _ = require("lodash"); +let host = require("./js/const").apiHost; + +const $ = (window.jQuery = require("jquery")); +require("@/components/js/datatable"); + +let table; +export default { + props: ["id", "meta"], + data() { + return { + rows: [], + header: [], + total: 0, + isDev: process.env.NODE_ENV === "development", + }; + }, + computed: { + jwt: function () { + return this.$store.getters["User/jwt"]; + }, + getRole: function () { + return this.$store.getters["User/userData"]; + }, + }, + mounted() { + const vm = this; + vm.createTable(vm.id); + }, + methods: { + editUpdateItem(id) { + // eslint-disable-next-line + this.$router.push("/updateitem/" + id); + }, + createTable(id) { + console.log("in created", this.getRole); + const vm = this; + const columns = [ + { + title: "ID", + data: "id", + fnCreatedCell: (nTd, sData, oData) => { + $(nTd).html(`<a href="" class="edit-link"> ${sData}</a>`); + }, + }, + { + title: "Name", + data: "attributes.Name", + }, + { + title: "Proteins", + data: "attributes.Proteins", + render: function (data, type, row, meta) { + if (data) { + let dat; + dat = data.map((e) => e.uniprot_id); + return dat; + } else { + return ""; + } + }, + }, + { + title: "Species Tax ID", + data: "attributes.SpeciesTaxId", + }, + { + title: "Status", + data: "attributes.Status", + fnCreatedCell: (nTd, sData, oData) => { + if (sData === "synced") { + $(nTd).html( + `<div class="rounded-full capitalize font-bold px-4 mr-2 bg-gray-500 text-white p-2 rounded flex items-center justify-center">${sData}</div>` + ); + } else if (sData === "accepted") { + $(nTd).html( + `<div class="rounded-full capitalize font-bold px-4 mr-2 bg-green-500 text-white p-2 rounded flex items-center justify-center">${sData}</div>` + ); + } else if (sData === "rejected") { + $(nTd).html( + `<div class="rounded-full capitalize font-bold px-4 mr-2 bg-red-500 text-white p-2 rounded flex items-center justify-center">${sData}</div>` + ); + } else if (sData === "requested") { + $(nTd).html( + `<div class="rounded-full capitalize font-bold px-4 mr-2 bg-yellow-500 text-white p-2 rounded flex items-center justify-center">${sData}</div>` + ); + } + }, + }, + { + title: "Submitted By", + data: "attributes.submittedBy.data.attributes.username", + }, + { + title: "Submitted At", + data: "attributes.SubmittedAt", + render: function (data, type, row, meta) { + return new Date(Date.parse(data)).toLocaleString(); + }, + }, + { + title: "Reviewer", + data: "attributes.reviewedBy", + render: function (data, type, row, meta) { + if (data.data) { + return data.data.attributes.username; + } else { + return ""; + } + }, + }, + + { + title: "Action", + + defaultContent: `<button class=" rounded-md bg-transparent hover:bg-blue-500 text-blue-700 + hover:text-white + border border-blue-500 + hover:border-transparent + focus:ring-2 focus:ring-blue-300 + items-center + px-4 + py-2 + font-bold + text-center view-link">View + </button>`, + }, + ]; + const nTableOptions = { + columns, + // aaSorting: [[ 0, 'asc' ]], + lengthMenu: [ + [10, 25, 50, 100], + [10, 25, 50, 100], + ], + paging: true, + searching: true, + info: true, + bProcessing: true, + bServerSide: true, + order: [], // order: [[0, 'asc']], + bDestroy: true, // Add this property to new setting, + oLanguage: { + sSearch: "Filter", + }, + + fnServerData: function (sSource, aoData, fnCallback, oSettings) { + oSettings.jqXHR = vm.fetchCallback(vm.rows, aoData, fnCallback); + }, + dom: '<"row"<"col-sm-2"l><"col-sm-2"f><"col-sm-8"p>><"row"t><"row"<"col-sm-4"i><"col-sm-8"p>>', + }; + + const tableId = `#${id}`; + if (table) { + table.destroy(); + $(tableId).empty(); + } + + table = $(tableId).DataTable(nTableOptions); + + const tableBody = `${tableId} tbody`; + + $(table.row(1).nodes()).addClass("Highlight_inUse"); + + $(tableBody).on("click", "tr td a.edit-link", (e) => { + e.preventDefault(); + const tr = $(e.target).parent().parent(); + const row = table.row(tr); + vm.editUpdateItem(row.data().id); + }); + $(tableBody).on("click", "tr td button.view-link", (e) => { + e.preventDefault(); + const tr = $(e.target).parent().parent(); + const row = table.row(tr); + vm.editUpdateItem(row.data().id); + }); + }, + async fetchCallback(data, aoData, fnCallback) { + let vm = this; + console.log("in fetch call back"); + // console.log(aoData) + let orderItem = aoData.find((x) => x.name === "order"); + let startItem = aoData.find((x) => x.name === "start"); + let lengthItem = aoData.find((x) => x.name === "length"); + let searchItem = aoData.find((x) => x.name === "search"); + // console.log(`length = ${lengthItem.value}, offset = ${startItem.value}`) + // console.log(`orderItem = ${orderItem.value}, searchItem = ${searchItem.value.value}`) + + const page = startItem.value / lengthItem.value + 1; + + let search = searchItem.value.value; + + if (vm.isDev) { + host = require("./js/const").devApiHost; + } + + const qs = require("qs"); + const query = { + pagination: { + pageSize: lengthItem.value, + page: page, + }, + }; + + const columns = [ + "id", + "Name", + "SpeciesTaxId", + "Proteins", + "IsExperimental", + + "Status", + "SubmittedAt", + ]; + + let order = ["SubmittedAt:desc"]; + if (orderItem.value.length > 0) { + orderItem.value.forEach(function (data) { + // console.log(data) + order = `${columns[data.column]}:${data.dir}`; + }); + // console.log(order) + } + + query["sort"] = order; + + if (searchItem.value.value) { + query["filters"] = { + $or: [ + { + Entity: { + $containsi: search, + }, + }, + { + EntityId: { + $containsi: search, + }, + }, + { + ChangeOperation: { + $containsi: search, + }, + }, + { + Attribute: { + $containsi: search, + }, + }, + { + Value: { + $containsi: search, + }, + }, + ], + }; + } + + const queryString = qs.stringify(query, { + encodeValuesOnly: true, + }); + + let url = `${host}/api/novel-condensates?${queryString}`; + + console.log("url is", url); + + const jwt = vm.jwt; + if (jwt === null) { + return; + } + + try { + const res = await this.axios.get(url, { + headers: { + Authorization: `Bearer ${jwt}`, + }, + }); + + console.log("response", res); + + if (res.data) { + let dat = { + draw: aoData.draw, + recordsTotal: query["filters"] + ? vm.total + : (vm.total = res.data.meta.pagination.total), + recordsFiltered: res.data.meta.pagination.total, + data: res.data.data, + }; + + fnCallback(dat); + } + } catch (error) { + this.error = true; + this.errorMsg = "You are not authorized to access this item."; + } + }, + }, +}; +</script> + +<style> +</style> \ No newline at end of file diff --git a/web/src/components/js/const.js b/web/src/components/js/const.js index 7c333b3..c3a351c 100644 --- a/web/src/components/js/const.js +++ b/web/src/components/js/const.js @@ -1,12 +1,12 @@ export const host = '/api'; -export const devHost = '/api'; -export const apiHost = '/cms'; -export const devApiHost = '/cms'; +// export const devHost = '/api'; +// export const apiHost = '/cms'; +// export const devApiHost = '/cms'; -// export const devHost = 'https://dev.cd-code.org/api'; +export const devHost = 'https://dev.cd-code.org/api'; // export const devHost = 'http://localhost:5001'; -// export const apiHost = 'http://localhost:1337'; -// export const devApiHost = 'http://localhost:1337'; +export const apiHost = 'http://localhost:1337'; +export const devApiHost = 'http://localhost:1337'; // apikey should be give here: export const apikey = process.env.VUE_APP_API_KEY; diff --git a/web/src/views/NovelCondensate.vue b/web/src/views/NovelCondensate.vue new file mode 100644 index 0000000..f8f0286 --- /dev/null +++ b/web/src/views/NovelCondensate.vue @@ -0,0 +1,305 @@ +<template> + <div> + <base-toaster :open="toasterIsOpen" @close="hideDialog"> + <div class="flex justify-between items-center"> + <font-awesome-icon + class="ml-3" + icon="fa-solid fa-thumbs-up " + size="lg" + /> + + <h4>Request updated successfully!</h4> + <button class="btn btn-outline" @click="hideDialog"> + <font-awesome-icon icon="fa-regular fa-circle-xmark" size="2x" /> + </button> + </div> + </base-toaster> + <div class="flex items-center justify-center"> + <h3 v-show="error && !jwt" class="text-2xl text-red-500"> + {{ errorMsg }} + </h3> + <div + v-if="item === 'new' || loaded" + class="md:flex w-3/5 border border-gray-300 rounded-lg p-2 mt-5" + ></div> + </div> + </div> +</template> +<script> +import BaseSpinner from "../components/UI/BaseSpinner.vue"; +import BaseToaster from "../components/UI/BaseToaster.vue"; +let host = require("@/components/js/const").apiHost; + +export default { + components: { BaseSpinner, BaseToaster }, + props: ["itemId"], + data() { + return { + item: this.$route.params.item ? this.$route.params.item : this.itemId, + name: "", // [protein, condensate, condensate_protein] + speciesTaxId: "", + proteins: [], + synonyms: "", + status: "", // 1. requested, 2. accepted, 3. rejected, 4. synced + reviewerStatus: "Choose an action", + submittedBy: "", + submittedAt: "", // datetime + submissionComments: "", + reviewedBy: "", + reviewedAt: "", // datetime + reviewComments: "", + reviewerComments: "", + syncedAt: "", // datetime + syncResponse: "", // response from the sync process (errors if any) + loaded: false, + error: false, + errorMsg: `An error occurred, please try again`, + statusErrMsg: "", + reviewerCmtErrMsg: "", + isLoading: false, + toasterIsOpen: false, + actionErrMsg: "", + isDev: process.env.NODE_ENV === "development", + reqActions: ["Choose an action", "accepted", "rejected"], + }; + }, + 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"]; + }, + colorChange() { + if (this.status === "rejected") { + return `bg-red-500`; + } else if (this.status === "requested") { + return `bg-yellow-500`; + } else if (this.status === "synced") { + return `bg-gray-500`; + } else if (this.status === "accepted") { + return `bg-green-500`; + } + return ""; + }, + }, + mounted: async function () { + const vm = this; + + const jwt = vm.jwt; + if (jwt === null) { + vm.$router.push("/login"); + } else { + if (vm.item !== "new") { + vm.load(vm.item); + } + } + }, + methods: { + showDialog() { + this.toasterIsOpen = true; + }, + hideDialog() { + this.toasterIsOpen = false; + }, + validateReviewerCmt() { + this.error = false; + this.reviewerCmtErrMsg = ""; + }, + validateStatusChange() { + this.error = false; + this.statusErrMsg = ""; + }, + async update(e) { + e.preventDefault(); + + 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 = { + 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}`, + }, + } + ); + } else { + 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) + // console.log(error.response) + this.error = true; + this.errorMsg = error; + } + }, + async load(id) { + 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) + vm.isLoading = true; + try { + const res = await this.axios.get(`${host}/api/update-items/` + id, { + headers: { + Authorization: `Bearer ${jwt}`, + }, + }); + + console.log(res.data.data); + + 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.reviewerComments = d.ReviewComments; + vm.reviewedBy = d.reviewedBy; + vm.reviewedAt = d.ReviewedAt; + // ReviewedBy: + // ReviewedAt: + // ReviewComment: + vm.syncedAt = d.SyncedAt; + vm.syncResponse = d.SyncResponse; + } + vm.isLoading = false; + vm.loaded = true; + } catch (error) { + // console.error(error) + this.error = true; + this.errorMsg = "You are not authorized to access this item."; + vm.isLoading = false; + 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; + } + if (!this.reviewerStatus || this.reviewerStatus === "Choose an action") { + console.log("in update review true"); + this.error = true; + this.statusErrMsg = "Please select an action."; + + return; + } else if (this.reviewerStatus === this.status) { + this.error = true; + this.statusErrMsg = + "The new change status is same as previous. Please select another value."; + return; + } else if (!this.reviewComments) { + this.error = true; + this.reviewerCmtErrMsg = "Comment should not be empty!"; + return; + } + // console.log(vm.userData) + let dat = { + Status: this.reviewerStatus, + ReviewComments: this.reviewComments, + ReviewedAt: this.reviewedAt, + }; + this.isLoading = true; + try { + await this.axios.put( + `${host}/api/update-item/review/` + vm.item, + { + data: dat, + }, + { + headers: { + Authorization: `Bearer ${jwt}`, + }, + } + ); + + // console.log(res) + this.reviewComments = ""; + this.isLoading = false; + this.toasterIsOpen = true; + setTimeout(() => { + this.toasterIsOpen = false; + this.load(this.item); + }, 2000); + } catch (error) { + // console.log(error.response.data.error.message) + // console.log(error.response) + this.error = true; + this.errorMsg = error; + vm.isLoading = false; + } + }, + }, +}; +</script> +<style> +</style> diff --git a/web/src/views/UpdateItem.vue b/web/src/views/UpdateItem.vue index 4c5e533..819fac2 100644 --- a/web/src/views/UpdateItem.vue +++ b/web/src/views/UpdateItem.vue @@ -1,9 +1,6 @@ <template> <div> - <base-toaster - :open="toasterIsOpen" - @close="hideDialog" - > + <base-toaster :open="toasterIsOpen" @close="hideDialog"> <div class="flex justify-between items-center"> <font-awesome-icon class="ml-3" @@ -12,22 +9,13 @@ /> <h4>Request updated successfully!</h4> - <button - class="btn btn-outline" - @click="hideDialog" - > - <font-awesome-icon - icon="fa-regular fa-circle-xmark" - size="2x" - /> + <button class="btn btn-outline" @click="hideDialog"> + <font-awesome-icon icon="fa-regular fa-circle-xmark" size="2x" /> </button> </div> </base-toaster> <div class="flex items-center justify-center"> - <h3 - v-show="error && !jwt" - class="text-2xl text-red-500" - > + <h3 v-show="error && !jwt" class="text-2xl text-red-500"> {{ errorMsg }} </h3> <div @@ -49,10 +37,7 @@ > {{ item === "new" ? "Create new Update Item" : item }} </h1> - <form - class="w-full md:w-auto" - @submit.prevent="updateReview" - > + <form class="w-full md:w-auto" @submit.prevent="updateReview"> <div class="md:flex md:items-center mx-3 mb-6"> <div class="md:w-1/3"> <label @@ -78,12 +63,7 @@ focus:bg-gray-200 focus:border-blue-700 " > - <option - disabled - value="" - > - Please select one - </option> + <option disabled value="">Please select one</option> <option>protein</option> <option>condensate</option> <option>condensate_protein</option> @@ -118,7 +98,7 @@ " type="text" placeholder="UNE6" - > + /> </div> </div> @@ -148,12 +128,7 @@ focus:bg-gray-200 focus:border-blue-700 " > - <option - disabled - value="" - > - Please select one - </option> + <option disabled value="">Please select one</option> <option>add</option> <option>remove</option> <option>update</option> @@ -188,7 +163,7 @@ " type="text" placeholder="functional_type" - > + /> </div> </div> @@ -219,7 +194,7 @@ " type="text" placeholder="driver" - > + /> </div> </div> @@ -273,10 +248,24 @@ (userRole === 'Contributor' || userRole === 'Maintainer' || userRole === 'Administrator') && - itemId !== 'new' + itemId !== 'new' " :class="colorChange" - class="rounded-full font-bold capitalize mt-3 px-4 mr-2 w-40 text-white p-2 rounded flex items-center justify-center" + class=" + rounded-full + font-bold + capitalize + mt-3 + px-4 + mr-2 + w-40 + text-white + p-2 + rounded + flex + items-center + justify-center + " > <!-- <div class="rounded-full px-4 mr-2 bg-gray-500 text-white p-2 rounded flex items-center justify-center">${sData}</div> --> {{ status }} @@ -319,9 +308,6 @@ </p> </div> </div> - - - <!-- <button v-if="item !== 'new' && userRole !== 'Maintainer'" @@ -333,7 +319,7 @@ <span class="fa fa-arrow-right" /> </button> --> <div - v-if="status!='rejected'" + v-if="status != 'rejected'" class="md:flex md:items-center mx-3 mb-6" > <div class="md:w-1/3"> @@ -347,20 +333,27 @@ <div class="md:w-2/3"> <p v-if="!syncResponse" - class="mt-3 px-4 mr-2 w-full bg-gray-300 p-2 flex items-center justify-center" + class=" + mt-3 + px-4 + mr-2 + w-full + bg-gray-300 + p-2 + flex + items-center + justify-center + " > Yet to be synced. </p> - <p - v-else - class="mt-3" - > - {{ syncResponse }} + <p v-else class="mt-3"> + {{ syncResponse }} </p> </div> </div> <div - v-if="status!='rejected'" + v-if="status != 'rejected'" class="md:flex md:items-center mx-3 mb-6" > <div class="md:w-1/3"> @@ -374,14 +367,21 @@ <div class="md:w-2/3"> <p v-if="!syncedAt" - class="mt-3 px-4 mr-2 w-full bg-gray-300 p-2 flex items-center justify-center" + class=" + mt-3 + px-4 + mr-2 + w-full + bg-gray-300 + p-2 + flex + items-center + justify-center + " > Yet to be synced. </p> - <p - v-else - class="mt-3" - > + <p v-else class="mt-3"> {{ syncedAt }} </p> </div> @@ -390,23 +390,22 @@ <div v-if=" userRole === 'Maintainer' && - item !== 'new' && status!='synced' + item !== 'new' && + status != 'synced' " class="mt-10" > <div class="relative flex py-5 items-center"> <div class="flex-grow border-t border-gray-400" /> - <span - class="flex-shrink mx-4 text-gray-400" - >Reviewer Section</span> + <span class="flex-shrink mx-4 text-gray-400" + >Reviewer Section</span + > <div class="flex-grow border-t border-gray-400" /> </div> <div v-if="isLoading"> <base-spinner /> </div> - <h3 class="mb-6"> - Reviewer Action - </h3> + <h3 class="mb-6">Reviewer Action</h3> <div class="md:flex md:items-center mx-3 mb-6"> <div class="md:w-1/3"> @@ -420,7 +419,6 @@ <div class="md:w-2/3"> <div> <select - id="inline-status" v-model="reviewerStatus" class=" @@ -439,7 +437,7 @@ <!-- <option value="Select" selected disabled>Select</option> <option>accepted</option> <option>rejected</option> --> - + <option v-for="action in reqActions" :key="action" @@ -485,7 +483,6 @@ bg-transparent border-gray-500 hover:border-gray-700 - " type="text" placeholder="Reviewer comments here" @@ -516,11 +513,15 @@ </div> <div class="flex space-x-4"> <button - v-if=" userRole === 'Maintainer' && - item !== 'new' && status!='synced'" + v-if=" + userRole === 'Maintainer' && + item !== 'new' && + status != 'synced' + " type="submit" :disabled="entityId.length < 3" - class="text-white + class=" + text-white bg-blue-500 hover:bg-blue-700 focus:ring-2 focus:ring-blue-300 @@ -530,30 +531,25 @@ px-5 py-2.5 text-center - font-bold" + font-bold + " > - {{ "Update Review" }} + {{ "Update Review" }} </button> <div class="group"> <button - type="button" class=" - - bg-gray - - group-hover:bg-gray-400 - group-hover:text-white - - - focus:ring-2 focus:ring-gray-300 - rounded-lg - border border-gray-300 - px-5 - py-3 - hover:text-gray-900 - font-bold - " + bg-gray + group-hover:bg-gray-400 group-hover:text-white + focus:ring-2 focus:ring-gray-300 + rounded-lg + border border-gray-300 + px-5 + py-3 + hover:text-gray-900 + font-bold + " @click="$router.go(-1)" > Back @@ -567,81 +563,79 @@ </div> </template> <script> -import BaseSpinner from '../components/UI/BaseSpinner.vue'; -import BaseToaster from '../components/UI/BaseToaster.vue'; -let host = require('@/components/js/const').apiHost; +import BaseSpinner from "../components/UI/BaseSpinner.vue"; +import BaseToaster from "../components/UI/BaseToaster.vue"; +let host = require("@/components/js/const").apiHost; export default { - name: 'UpdateItem', + name: "UpdateItem", components: { BaseSpinner, BaseToaster }, - props: ['itemId'], + 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[] + 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 - reviewerStatus: 'Choose an action', - submittedBy: '', - submittedAt: '', // datetime - submissionComments: '', - reviewedBy: '', - reviewedAt: '', // datetime - reviewComments: '', - reviewerComments: '', - syncedAt: '', // datetime - syncResponse: '', // response from the sync process (errors if any) + 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 + reviewerStatus: "Choose an action", + submittedBy: "", + submittedAt: "", // datetime + submissionComments: "", + reviewedBy: "", + reviewedAt: "", // datetime + reviewComments: "", + reviewerComments: "", + syncedAt: "", // datetime + syncResponse: "", // response from the sync process (errors if any) loaded: false, error: false, errorMsg: `An error occurred, please try again`, - statusErrMsg: '', - reviewerCmtErrMsg: '', + statusErrMsg: "", + reviewerCmtErrMsg: "", isLoading: false, toasterIsOpen: false, - actionErrMsg:'', - isDev: process.env.NODE_ENV === 'development', - reqActions:['Choose an action','accepted', 'rejected'] + actionErrMsg: "", + isDev: process.env.NODE_ENV === "development", + reqActions: ["Choose an action", "accepted", "rejected"], }; }, computed: { jwt: function () { - return this.$store.getters['User/jwt']; + return this.$store.getters["User/jwt"]; }, userData: function () { - return this.$store.getters['User/userData']; + return this.$store.getters["User/userData"]; }, userRole: function () { - return this.$store.getters['User/userRole']; + return this.$store.getters["User/userRole"]; }, - colorChange(){ - if(this.status==='rejected'){ - return `bg-red-500` - }else if(this.status==='requested'){ - return `bg-yellow-500` + colorChange() { + if (this.status === "rejected") { + return `bg-red-500`; + } else if (this.status === "requested") { + return `bg-yellow-500`; + } else if (this.status === "synced") { + return `bg-gray-500`; + } else if (this.status === "accepted") { + return `bg-green-500`; } - else if(this.status==='synced'){ - return `bg-gray-500` - }else if(this.status==='accepted'){ - return `bg-green-500` - } - return '' - } + return ""; + }, }, mounted: async function () { const vm = this; const jwt = vm.jwt; if (jwt === null) { - vm.$router.push('/login'); + vm.$router.push("/login"); } else { - if (vm.item !== 'new') { + if (vm.item !== "new") { vm.load(vm.item); - } } }, @@ -650,15 +644,15 @@ export default { this.toasterIsOpen = true; }, hideDialog() { - this.toasterIsOpen = false; + this.toasterIsOpen = false; }, validateReviewerCmt() { this.error = false; - this.reviewerCmtErrMsg = ''; + this.reviewerCmtErrMsg = ""; }, validateStatusChange() { this.error = false; - this.statusErrMsg = ''; + this.statusErrMsg = ""; }, async update(e) { e.preventDefault(); @@ -666,7 +660,7 @@ export default { const vm = this; if (vm.isDev) { - host = require('@/components/js/const').devApiHost; + host = require("@/components/js/const").devApiHost; } const jwt = vm.jwt; @@ -683,7 +677,7 @@ export default { Value: this.attributeValue, ChangeOperation: this.changeOperation, SubmissionComments: this.submissionComments, - Status: vm.userRole === 'Maintainer' ? 'accepted' : this.status, + Status: vm.userRole === "Maintainer" ? "accepted" : this.status, // ReviewedBy: // ReviewedAt: // ReviewComment: @@ -692,7 +686,7 @@ export default { }; try { - if (vm.item !== 'new') { + if (vm.item !== "new") { const res = await this.axios.put( `${host}/api/update-items/` + vm.item, { @@ -720,7 +714,7 @@ export default { // console.log(res) - vm.$router.push('/profile'); + vm.$router.push("/profile"); } catch (error) { // console.log(error.response.data.error.message) // console.log(error.response) @@ -732,7 +726,7 @@ export default { const vm = this; if (vm.isDev) { - host = require('@/components/js/const').devApiHost; + host = require("@/components/js/const").devApiHost; } const jwt = vm.jwt; @@ -742,7 +736,7 @@ export default { } // console.log(vm.userData) -vm.isLoading= true; + vm.isLoading = true; try { const res = await this.axios.get(`${host}/api/update-items/` + id, { headers: { @@ -750,7 +744,7 @@ vm.isLoading= true; }, }); - console.log(res.data.data) + console.log(res.data.data); if (res.data.data) { const d = res.data.data.attributes; @@ -768,16 +762,16 @@ vm.isLoading= true; // ReviewedBy: // ReviewedAt: // ReviewComment: - vm.syncedAt=d.SyncedAt; - vm.syncResponse=d.SyncResponse + vm.syncedAt = d.SyncedAt; + vm.syncResponse = d.SyncResponse; } -vm.isLoading=false; + vm.isLoading = false; vm.loaded = true; } catch (error) { // console.error(error) this.error = true; - this.errorMsg = 'You are not authorized to access this item.'; - vm.isLoading=false; + this.errorMsg = "You are not authorized to access this item."; + vm.isLoading = false; setTimeout(() => vm.$router.go(-1), 2000); } }, @@ -785,7 +779,7 @@ vm.isLoading=false; const vm = this; if (vm.isDev) { - host = require('@/components/js/const').devApiHost; + host = require("@/components/js/const").devApiHost; } const jwt = vm.jwt; @@ -793,22 +787,20 @@ vm.isLoading=false; vm.loaded = false; return; } - if (!this.reviewerStatus || this.reviewerStatus === 'Choose an action') { - console.log('in update review true'); + if (!this.reviewerStatus || this.reviewerStatus === "Choose an action") { + console.log("in update review true"); this.error = true; - this.statusErrMsg = - 'Please select an action.'; + this.statusErrMsg = "Please select an action."; return; - }else if (this.reviewerStatus===this.status) { + } else if (this.reviewerStatus === this.status) { this.error = true; this.statusErrMsg = - 'The new change status is same as previous. Please select another value.'; + "The new change status is same as previous. Please select another value."; return; - } - else if (!this.reviewComments) { + } else if (!this.reviewComments) { this.error = true; - this.reviewerCmtErrMsg = 'Comment should not be empty!'; + this.reviewerCmtErrMsg = "Comment should not be empty!"; return; } // console.log(vm.userData) @@ -832,20 +824,19 @@ vm.isLoading=false; ); // console.log(res) - this.reviewComments = ''; + this.reviewComments = ""; this.isLoading = false; this.toasterIsOpen = true; setTimeout(() => { - this.toasterIsOpen =false; - this.load(this.item); - + this.toasterIsOpen = false; + this.load(this.item); }, 2000); } catch (error) { // console.log(error.response.data.error.message) // console.log(error.response) this.error = true; this.errorMsg = error; - vm.isLoading=false; + vm.isLoading = false; } }, }, diff --git a/web/src/views/UpdateItems.vue b/web/src/views/UpdateItems.vue index 9a3f487..fa5dfb6 100644 --- a/web/src/views/UpdateItems.vue +++ b/web/src/views/UpdateItems.vue @@ -4,48 +4,58 @@ <div v-if=" userData !== null && - (userRole === 'Contributor' || userRole === 'Maintainer') + (userRole === 'Contributor' || userRole === 'Maintainer') " class="my-14 border border-gray-300 rounded-lg p-8" > <update-item-table id="update-item-table" /> </div> + <div + v-if=" + userData !== null && + (userRole === 'Contributor' || userRole === 'Maintainer') + " + class="my-14 border border-gray-300 rounded-lg p-8" + > + <novel-condensate-requests id="novel-condensate-requests" /> + </div> </div> </div> </template> <script> // import BaseSpinner from "../components/UI/BaseSpinner.vue"; // import BaseToaster from "../components/UI/BaseToaster.vue"; -import UpdateItemTable from '@/components/UpdateItemTable'; -let host = require('@/components/js/const').apiHost; +import UpdateItemTable from "@/components/UpdateItemTable"; +import NovelCondensateRequests from "@/components/NovelCondensateRequests"; +let host = require("@/components/js/const").apiHost; export default { - name: 'UpdateItems', - components: { UpdateItemTable }, - props: ['itemId'], + name: "UpdateItems", + components: { UpdateItemTable, NovelCondensateRequests }, + props: ["itemId"], data() { return { - isDev: process.env.NODE_ENV === 'development', + isDev: process.env.NODE_ENV === "development", editMode: false, toasterIsOpen: false, }; }, computed: { jwt: function () { - return this.$store.getters['User/jwt']; + return this.$store.getters["User/jwt"]; }, userData: function () { - return this.$store.getters['User/userData']; + return this.$store.getters["User/userData"]; }, userRole: function () { - return this.$store.getters['User/userRole']; + return this.$store.getters["User/userRole"]; }, }, mounted: async function () { const vm = this; if (vm.userData === null) { - this.$router.push('/login'); + this.$router.push("/login"); } else { vm.user = vm.userData.id; vm.current_role = vm.userData.current_role; @@ -67,8 +77,8 @@ export default { <style scoped> @import url("~@/assets/bootstrap.css"); -div.tablecontainer{ - width: 80% +div.tablecontainer { + width: 80%; } a { -- GitLab