From 1f2b2d0c5a61cbb3d924fed66c4961bdfef562e4 Mon Sep 17 00:00:00 2001 From: raghosh <raghosh@loaner-laptop-13.local> Date: Wed, 11 May 2022 18:34:27 +0200 Subject: [PATCH] #68: Added contributor table for each request page to list out top contributors. --- .../update-item/controllers/update-item.js | 63 ++++++ .../update-item/routes/custom-update-item.js | 5 + web/src/components/CondensateDetailPage.vue | 8 + web/src/components/ContributorListTable.vue | 179 ++++++++++++++++++ web/src/components/Links.vue | 4 +- web/src/components/ProteinDetailPage.vue | 8 + web/src/components/UpdateItemTable.vue | 4 +- web/src/components/js/const.js | 2 +- web/src/views/Login.vue | 2 +- 9 files changed, 269 insertions(+), 6 deletions(-) create mode 100644 web/src/components/ContributorListTable.vue diff --git a/cms/src/api/update-item/controllers/update-item.js b/cms/src/api/update-item/controllers/update-item.js index 68cec5c..0c810e4 100644 --- a/cms/src/api/update-item/controllers/update-item.js +++ b/cms/src/api/update-item/controllers/update-item.js @@ -79,6 +79,7 @@ module.exports = createCoreController('api::update-item.update-item', ({ strapi return response; }, async find(ctx) { + // console.log(ctx.state.user.role.name); ctx.query['populate'] = ['submittedBy', 'reviewedBy']; @@ -258,6 +259,68 @@ module.exports = createCoreController('api::update-item.update-item', ({ strapi } return res }, + + async filterContributors(ctx) { + + // const entries = await strapi.entityService.findMany('api::update-item.update-item', { + // filters: { + // EntityId: { $contains: ctx.params.id, + // }, + // Status: "synced" + // }, + // populate: { + // submittedBy: { + // fields: ['full_name', 'username'], + // } + // } + // }); + + + console.log(ctx.params.entity); + + if (ctx.params.entity === 'condensate') { + const [entries] = await strapi.db.query('plugin::users-permissions.user').findWithCount({ + + select: ['username', 'full_name'], + populate: { + SubmittedUpdateItems: { + where: { + EntityId: { $contains: ctx.params.id, }, + Entity: { $startsWith: ctx.params.entity }, + Status: 'synced', + }, + } + }, + orderBy: { id: 'DESC' }, + + }); + const { data, meta } = await super.find(ctx); + + return { entries, meta }; + } else if (ctx.params.entity === 'protein') { + const [entries] = await strapi.db.query('plugin::users-permissions.user').findWithCount({ + + select: ['username', 'full_name'], + populate: { + SubmittedUpdateItems: { + where: { + EntityId: { $eq: ctx.params.id, }, + Entity: { $eq: ctx.params.entity }, + Status: 'synced', + }, + } + }, + orderBy: { id: 'DESC' }, + + }); + + const { data, meta } = await super.find(ctx); + + return { entries, meta }; + + } + }, + async findOne(ctx) { // console.log(ctx); const { id } = ctx.params; diff --git a/cms/src/api/update-item/routes/custom-update-item.js b/cms/src/api/update-item/routes/custom-update-item.js index dfec063..2224f5e 100644 --- a/cms/src/api/update-item/routes/custom-update-item.js +++ b/cms/src/api/update-item/routes/custom-update-item.js @@ -16,5 +16,10 @@ module.exports = { path: '/update-item/filterCondensateRequest/:id', handler: 'api::update-item.update-item.filterCondensateRequest', }, + { + method: 'GET', + path: '/update-item/filterContributors/:entity/:id', + handler: 'api::update-item.update-item.filterContributors', + }, ] } diff --git a/web/src/components/CondensateDetailPage.vue b/web/src/components/CondensateDetailPage.vue index a95e0a2..b563d5a 100644 --- a/web/src/components/CondensateDetailPage.vue +++ b/web/src/components/CondensateDetailPage.vue @@ -798,6 +798,12 @@ :data="response.data.canonical_id" /> </div> + <div class="my-14 border border-gray-300 rounded-lg p-8"> + <h4 class="round mb-8"> + Contributors + </h4> + <contributor-list-table :id="response.data.canonical_id" entity="condensate" /> + </div> <!-- <request-update-item-table id="protein-table" @@ -858,6 +864,7 @@ import BaseSpinner from './UI/BaseSpinner.vue'; import CondensateUpdateItemsTable from './CondensateUpdateItemsTable.vue'; import BaseToaster from './UI/BaseToaster.vue'; import StarRating from 'vue-star-rating'; +import ContributorListTable from './ContributorListTable.vue'; //import FetchUserSpecificUpdateItems from './CMS/fetchUserSpecificUpdateItems.vue'; //import RequestUpdateItemTable from "./RequestUpdateItemTable.vue"; @@ -878,6 +885,7 @@ export default { CondensateUpdateItemsTable, BaseToaster, StarRating, + ContributorListTable, // FetchUserSpecificUpdateItems, // RequestUpdateItemTable, diff --git a/web/src/components/ContributorListTable.vue b/web/src/components/ContributorListTable.vue new file mode 100644 index 0000000..0de171a --- /dev/null +++ b/web/src/components/ContributorListTable.vue @@ -0,0 +1,179 @@ +<template> + <section> + <div class="relative overflow-x-auto shadow-md sm:rounded-lg"> + <h2 class="text-red-500" v-if="error"> + {{ errorMsg }} + </h2> + <h5 class="text-center" v-if="!showTable">No contribution made yet.</h5> + <table + v-else + class="w-full table-auto text-left text-gray-500 dark:text-gray-400" + > + <thead + class=" + bg-gray-50 + text-gray-700 + uppercase + dark:bg-gray-700 dark:text-gray-400 + " + > + <tr class="p-8"> + <th + scope="col" + class="px-6 py-3" + v-for="item in tableHeader" + :key="item" + > + {{ item }} + </th> + </tr> + </thead> + <tbody> + <tr + v-for="items in topContributors" + :key="items.id" + class="bg-white border-b dark:bg-gray-800 dark:border-gray-700" + > + <td + scope="row" + class=" + px-6 + py-4 + font-medium + text-gray-900 + dark:text-white + whitespace-nowrap + " + > + {{ items.fullName }} + </td> + <td + scope="row" + class=" + px-6 + py-4 + font-medium + text-gray-900 + dark:text-white + whitespace-nowrap + " + > + <span + class=" + bg-blue-100 + text-blue-800 + font-semibold + mr-2 + px-2.5 + py-0.5 + rounded + dark:bg-blue-200 dark:text-blue-800 + " + > + {{ items.contribution }} + </span> + </td> + </tr> + </tbody> + </table> + </div> + </section> +</template> + +<script> +let host = require("@/components/js/const").apiHost; +export default { + props: ["id", "entity"], + data() { + return { + tableHeader: ["Name", "Contributions"], + + isDev: process.env.NODE_ENV === "development", + topContributors: null, + error: false, + errorMsg: "", + showTable: true, + }; + }, + mounted() { + this.getContributors(); + }, + + methods: { + async getContributors() { + if (this.isDev) { + host = require("@/components/js/const").devApiHost; + } + + try { + const res = await fetch( + `${host}/api/update-item/filterContributors/${this.entity}/${this.id}` + ); + if (!res.ok) { + this.error = true; + this.errorMsg = `${res.status} Internal Error, please write a mail to DDCode Admin`; + + return; + } + + if (!res.ok && res.status === 500) { + this.error = true; + this.errorMsg = `${res.status} Internal Error, please write a mail to DDCode Admin`; + + return; + } + if (!res.ok && res.status === 405) { + this.error = true; + this.errorMsg = `${res.status} Internal Error, please write a mail to DDCode Admin`; + + return; + } + + this.error = false; + this.errorMsg = ""; + const response = await res.json(); + + const convertedArray = response.entries.map((e) => ({ + id: e.id, + username: e.username, + fullName: e.full_name, + contribution: e.SubmittedUpdateItems.length, + })); + + let sortedArray = convertedArray.sort( + (a, b) => b.contribution - a.contribution + ); + + // const sorted = [...new Set(convertedArray)].sort((a, b) => b.contribution - a.contribution); + let syncedList = sortedArray.filter((list) => list.contribution > 0); + if (syncedList.length === 0) { + this.showTable = false; + return; + } + this.showTable = true; + let rank = 1; + for (let i in syncedList) { + if ( + i > 0 && + syncedList[i].contribution < syncedList[i - 1].contribution + ) { + rank += 1; + } + syncedList[i].rank = rank; + } + + let top10Contributors = syncedList.filter((list) => list.rank <= 10); + + this.topContributors = top10Contributors; + } catch (err) { + this.error = true; + this.errorMsg = `${err.message} Internal Error, please write a mail to DDCode Admin`; + console.log(err); + } + }, + }, +}; +</script> + +<style> +</style> \ No newline at end of file diff --git a/web/src/components/Links.vue b/web/src/components/Links.vue index 9da15d6..934350c 100644 --- a/web/src/components/Links.vue +++ b/web/src/components/Links.vue @@ -258,7 +258,7 @@ </router-link> </li> <li - v-show="userData !== null" + v-if="userData !== null" role="presentation" @mouseover="openCondensateSubMenu = false" > @@ -270,7 +270,7 @@ </router-link> </li> <li - v-show="userData === null" + v-if="userData === null" role="presentation" :class="{ active: $route.name === 'login' }" @mouseover="openCondensateSubMenu = false" diff --git a/web/src/components/ProteinDetailPage.vue b/web/src/components/ProteinDetailPage.vue index 3c08a7d..a5a0afa 100644 --- a/web/src/components/ProteinDetailPage.vue +++ b/web/src/components/ProteinDetailPage.vue @@ -435,6 +435,12 @@ :data="protein" /> </div> + <div class="border border-gray-300 rounded-lg p-8"> + <h4 class="round mb-8"> + Contributors + </h4> + <contributor-list-table :id="protein" entity="protein" /> + </div> </div> </slot> </template> @@ -453,6 +459,7 @@ import AddDeletePubmed from './CMS/addDeletePubmed.vue'; //import FetchUserSpecificUpdateItems from './CMS/fetchUserSpecificUpdateItems.vue'; import ProteinUpdateItemTable from './ProteinUpdateItemTable.vue'; import BaseSpinner from './UI/BaseSpinner.vue'; +import ContributorListTable from './ContributorListTable.vue'; //import BaseToaster from "./UI/BaseToaster.vue"; const $ = (window.jQuery = require('jquery')); @@ -470,6 +477,7 @@ export default { ProteinUpdateItemTable, BaseSpinner, + ContributorListTable, }, props: ['proteinId'], diff --git a/web/src/components/UpdateItemTable.vue b/web/src/components/UpdateItemTable.vue index 83f0ce0..dcac560 100644 --- a/web/src/components/UpdateItemTable.vue +++ b/web/src/components/UpdateItemTable.vue @@ -81,7 +81,7 @@ export default { title: 'Value', data: 'attributes.Value', render: function (data, type, row, meta) { - console.log('all changes now', data); + if(data==='frap'){ return data.toUpperCase(); }else if(data === 'self_ps'){ @@ -295,7 +295,7 @@ export default { recordsFiltered: res.data.meta.pagination.total, data: res.data.data } - + console.log("what data is in another", dat); fnCallback(dat) } } catch(error) { diff --git a/web/src/components/js/const.js b/web/src/components/js/const.js index 68137d1..7c333b3 100644 --- a/web/src/components/js/const.js +++ b/web/src/components/js/const.js @@ -3,7 +3,7 @@ export const devHost = '/api'; export const apiHost = '/cms'; export const devApiHost = '/cms'; -// export const devHost = 'https://dev.ddcode.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'; diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue index 8af1df9..6a34903 100644 --- a/web/src/views/Login.vue +++ b/web/src/views/Login.vue @@ -227,7 +227,7 @@ export default { password: this.password.val, }), }); - console.log('response is',res); + if(!res.ok){ this.isLoading = false; -- GitLab