diff --git a/components/member/List.vue b/components/member/List.vue new file mode 100644 index 0000000000000000000000000000000000000000..ccb5d4938421d25375da0d80187098b76c65720d --- /dev/null +++ b/components/member/List.vue @@ -0,0 +1,47 @@ +<template> + <div class="table-responsive"> + <table class="table table-striped table-hover"> + <thead v-if="displayHead"> + <tr> + <th scope="col">UID</th> + <th scope="col" class="d-none d-xl-table-cell" v-if="displayPubkey">PUBKEY</th> + </tr> + </thead> + <tbody> + <tr v-for="member in members" :key="member.uid" + @click="redirect('/membres/' + member.hash)"> + <th scope="row"> + {{ member.uid }} + <BadgeCertifStatus :limitDate="member.received_certifications.limit" :memberStatus="member.status" /> + <BadgeStatus :membre="member" /> + </th> + <td class="d-none d-xl-table-cell" v-if="displayPubkey">{{ member.pubkey }}</td> + </tr> + </tbody> + </table> + </div> +</template> + +<script> +export default { + props: { + members: { + type: Array, + required: true + }, + displayPubkey: { + type: Boolean, + default: true + }, + displayHead: { + type: Boolean, + default: true + } + }, + methods: { + redirect(path) { + this.$router.push({ path: path }) + } + }, +} +</script> \ No newline at end of file diff --git a/graphql/index.js b/graphql/index.js new file mode 100644 index 0000000000000000000000000000000000000000..c0498f9744a8dc33c8f2c2b78dd4c305efba6ab5 --- /dev/null +++ b/graphql/index.js @@ -0,0 +1,26 @@ +import { HttpLink } from 'apollo-link-http' +import { setContext } from 'apollo-link-context' +import { from } from 'apollo-link' +import { InMemoryCache } from 'apollo-cache-inmemory' + +export default ctx => { + const ssrMiddleware = setContext((_, { headers }) => { + if (process.client) return headers + return { + headers + } + }) + + const httpLink = new HttpLink({ + uri: 'https://wwgql.coinduf.eu' + }) + + const link = from([ssrMiddleware, httpLink]) + const cache = new InMemoryCache({addTypename:false}) + + return { + link, + cache, + defaultHttpLink: false + } +} \ No newline at end of file diff --git a/nuxt.config.js b/nuxt.config.js index 12186952608dddcc09967bd951c52e659d2585d8..ec819ebf619d188d22ce15888319dc52199bbed9 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -54,9 +54,7 @@ export default { apollo: { clientConfigs: { - default: { - httpEndpoint: 'https://wwgql.coinduf.eu', - }, + default: '~/graphql' }, }, diff --git a/pages/index.vue b/pages/index.vue index 99cad9fa301f8b2efff101405a935690090c0662..c967f6fbf2651bc549ef1595bcfc65af756ab3e1 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -1,16 +1,25 @@ <template> -<main class="container-fluid"> +<main class="container"> <h2 class="display-2 text-center mb-5">Page d'accueil</h2> - <div class="row"> - <div class="col-6 m-auto text-center"> - <p>Wotwizard-UI est une application web qui a pour but d'offrir une meilleure expérience utilisateur que celle actuellement disponible pour <a href="https://wot-wizard.duniter.org" target="_blank">Wotwizard</a>.</p> - <p>Le code source du projet est disponible sur <a href="https://git.duniter.org/clients/wotwizard-ui" target="_blank">le Gitlab des développeurs de la monnaie libre</a>.</p> + <NavigationLoader :isLoading="$apollo.queries.newMembers.loading" class="d-block mx-auto" /> + <div class="row text-center" v-if="!$apollo.queries.newMembers.loading"> + <div class="col-lg-6"> + <div> + <h2 class="h4">Bienvenue à </h2> + <MemberList :members="newMembers['entrees']" :displayPubkey="false" :displayHead="false" /> + </div> + </div> + <div class="col-lg-6"> + <h2 class="h4">Au revoir à </h2> + <MemberList :members="newMembers['sorties']" :displayPubkey="false" :displayHead="false" /> </div> </div> </main> </template> <script> +import gql from 'graphql-tag' + export default { data() { // Variables locales @@ -22,13 +31,48 @@ export default { active: true } ], - hello: '' + today : Math.round(Date.now() /1000) } }, // Fonctions locales methods: { - helloWorld(e) { - this.hello = e.target.dataset.response + + }, + apollo: { + newMembers : { + query: gql`query LastEvents($start: Int64, $end: Int64) { + membersCount(start: $start, end: $end) { + idList { + id { + pubkey + uid + status + hash + limitDate + received_certifications { + limit + } + } + inOut + } + } + } `, + variables(){return {start:this.today-86400*2,end:this.today}}, + update (data) { + let result = {'entrees':[],'sorties':[]} + + for (let i = 0; i < data.membersCount.length; i++) { + let member = data.membersCount[i].idList[0] + member.id.inOut = member.inOut + if (member.inOut) { + result['entrees'].push(member.id) + } else { + result['sorties'].push(member.id) + } + } + + return result + } } }, mounted () { diff --git a/pages/membres/index.vue b/pages/membres/index.vue index 9fd6540a9d51f1f4ed9aea989a76b532e3cb7684..8b544c7122d3bb8a853eec788d1c61f726e6b469 100644 --- a/pages/membres/index.vue +++ b/pages/membres/index.vue @@ -4,34 +4,14 @@ <div class="row mb-4"> <div class="col-6 m-auto text-center"> <label for="rech" class="form-label">Votre recherche</label> - <input type="text" class="form-control" id="rech" aria-describedby="rechHelp" v-model="param" autocomplete="off"> + <input type="text" class="form-control" id="rech" aria-describedby="rechHelp" v-model="param" autocomplete="off" @keyup="save"> <small id="rechHelp" class="form-text text-muted">Saisissez le début d'un pseudo ou d'une clé publique</small> </div> </div> <NavigationLoader :isLoading="$apollo.queries.idSearch.loading" class="d-block mx-auto" /> <div class="row" v-if="idSearch && !$apollo.queries.idSearch.loading && param.length > 2"> <div class="col-8 m-auto"> - <div class="table-responsive"> - <table class="table table-striped table-hover"> - <thead> - <tr> - <th scope="col">UID</th> - <th scope="col" class="d-none d-xl-table-cell">PUBKEY</th> - </tr> - </thead> - <tbody> - <tr v-for="member in idSearch.ids" :key="member.uid" - @click="redirect('/membres/' + member.hash)"> - <th scope="row"> - {{ member.uid }} - <BadgeCertifStatus :limitDate="member.received_certifications.limit" :memberStatus="member.status" /> - <BadgeStatus :membre="member" /> - </th> - <td class="d-none d-xl-table-cell">{{ member.pubkey }}</td> - </tr> - </tbody> - </table> - </div> + <MemberList :members="idSearch.ids"/> </div> </div> </main> @@ -61,10 +41,9 @@ export default { }, // Fonctions locales methods: { - redirect(path) { - localStorage.setItem('search', this.param) - this.$router.push({ path: path }) - } + save() { + localStorage.setItem('search', this.param) + } }, apollo: { idSearch : {