runs: add fetch more button and related logic

This commit is contained in:
Simone Gotti 2019-05-14 14:04:36 +02:00
parent 7f90c73650
commit 5d6f6b8290
2 changed files with 50 additions and 13 deletions

View File

@ -1,8 +1,8 @@
<template> <template>
<div> <div>
<div class="item-list">
<div v-if="runs.length > 0"> <div v-if="runs.length > 0">
<div class="item" v-for="run in runs" v-bind:key="run.id" :class="runResultClass(run)"> <div class="item-list">
<div v-for="run in runs" v-bind:key="run.id" :class="runResultClass(run)">
<div class="item-content"> <div class="item-content">
<router-link <router-link
v-if="username" v-if="username"
@ -61,9 +61,16 @@
</div> </div>
</div> </div>
</div> </div>
<div v-else class="item-list">No runs</div> <div class="has-text-centered">
<button
v-if="hasMoreRuns"
class="button is-primary is-outlined is-fullwidth load-more-button"
@click="loadMoreRuns()"
>Load more...</button>
</div> </div>
</div> </div>
<div v-else class="item-list">No runs</div>
</div>
</template> </template>
<script> <script>
@ -83,6 +90,8 @@ export default {
data() { data() {
return { return {
runs: [], runs: [],
wantedRunsNumber: 25,
hasMoreRuns: false,
polling: null, polling: null,
project: null, project: null,
user: null user: null
@ -151,6 +160,11 @@ export default {
this.fetchRuns(); this.fetchRuns();
}, },
loadMoreRuns() {
this.wantedRunsNumber += 25;
this.fetchRuns();
},
// TODO(sgotti) use run events instead of refetching all runs everytime
async fetchRuns() { async fetchRuns() {
let group; let group;
let lastrun = false; let lastrun = false;
@ -171,12 +185,29 @@ export default {
group = "/user/" + this.user.id; group = "/user/" + this.user.id;
} }
let { data, error } = await fetchRuns(group, lastrun); let newRuns = [];
let hasMoreRuns = false;
let stopFetch = false;
let runCount = 0;
let startRunID = null;
while (!stopFetch) {
let { data, error } = await fetchRuns(group, startRunID, lastrun);
if (error) { if (error) {
this.$store.dispatch("setError", error); this.$store.dispatch("setError", error);
return; return;
} }
this.runs = data; runCount += data.length;
if (runCount >= this.wantedRunsNumber || data.length == 0) {
hasMoreRuns = data.length != 0;
stopFetch = true;
}
newRuns = newRuns.concat(data);
if (newRuns.length) {
startRunID = newRuns[newRuns.length - 1].id;
}
}
this.runs = newRuns;
this.hasMoreRuns = hasMoreRuns;
}, },
pollData() { pollData() {
clearInterval(this.polling); clearInterval(this.polling);
@ -210,9 +241,6 @@ export default {
} }
.item-list { .item-list {
.item {
}
.item-content { .item-content {
margin-bottom: 5px; margin-bottom: 5px;
border: 1px solid $grey-lighter; border: 1px solid $grey-lighter;
@ -277,4 +305,9 @@ export default {
font-size: 0.8rem; font-size: 0.8rem;
} }
} }
.load-more-button {
margin-top: 1rem;
margin-bottom: 2rem;
}
</style> </style>

View File

@ -50,7 +50,8 @@ export async function fetchOrgMembers(orgref) {
let path = "/orgs/" + orgref + "/members" let path = "/orgs/" + orgref + "/members"
return await fetch(apiurl(path)); return await fetch(apiurl(path));
} }
export async function fetchRuns(group, lastrun) {
export async function fetchRuns(group, startRunID, lastrun) {
let u = apiurl("/runs"); let u = apiurl("/runs");
if (group) { if (group) {
u.searchParams.append("group", group) u.searchParams.append("group", group)
@ -58,6 +59,9 @@ export async function fetchRuns(group, lastrun) {
if (lastrun) { if (lastrun) {
u.searchParams.append("lastrun", true) u.searchParams.append("lastrun", true)
} }
if (startRunID) {
u.searchParams.append("start", startRunID)
}
return await fetch(u) return await fetch(u)
} }