converted version approval queue to vue

* fixed a couple version approval links that didn't use the new unique version string
This commit is contained in:
Jake Potrebic 2021-01-18 16:30:52 -08:00
parent d29c0715f7
commit 81a14f4a10
No known key found for this signature in database
GPG Key ID: 7C58557EC9C421F8
4 changed files with 157 additions and 196 deletions

View File

@ -0,0 +1,145 @@
<template>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title" v-text="$t('user.queue.progress')"></h3>
</div>
<table class="table table-hover mb-0">
<thead>
<tr>
<th>Project version</th>
<th>Queued by</th>
<th style="text-align: right; max-width: 40px"></th>
<th>Status</th>
<th></th>
</tr>
</thead>
<tbody>
<tr v-if="!underReview.length">
<th rowspan="5">
<h4 v-text="$t('queue.review.none')"></h4>
</th>
</tr>
<tr
v-for="entry in underReview"
:key="entry.namespace + '/' + entry.versionStringUrl"
:class="{ warning: entry.unfinished && entry.reviewerId === currentUser.id }"
>
<td>
<a :href="ROUTES.parse('VERSIONS_SHOW', entry.author, entry.slug, entry.versionStringUrl)" v-text="entry.namespace"></a>
<br />
{{ entry.versionString }}
<span class="channel" :style="{ backgroundColor: entry.channelColor.hex }" v-text="entry.channelName"></span>
</td>
<td>
<a v-if="entry.versionAuthor" :href="`https://papermc.io/forums/users/${entry.versionAuthor}`" v-text="entry.versionAuthor"></a>
<span v-else>Unknown</span>
<br />
<span class="faint" v-text="new Date(entry.versionCreatedAt).toLocaleDateString()"></span>
</td>
<td v-if="entry.unfinished" style="text-align: right; max-width: 40px">
<i v-if="currentUser.id === entry.reviewerId" class="status fas fa-fw fa-play-circle fa-2x" style="color: green"></i>
<i v-else class="status fas fa-fw fa-cog fa-2x" style="color: black"></i>
</td>
<td v-else style="text-align: right; max-width: 40px">
<i class="status fas fa-fw fa-pause-circle fa-2x" style="color: orange"></i>
</td>
<td v-if="entry.unfinished" style="color: darkred">
{{ entry.reviewerName }}
<br />
<span v-if="Date.now() - new Date(entry.reviewStarted) >= maxReviewTime">pastdue </span>
<span v-else>started </span>
<span>{{ ((Date.now() - new Date(entry.reviewStarted)) / 1000 / 60 / 60).toFixed(2) }} hours ago</span>
</td>
<td v-else>
<span v-text="entry.reviewerName" style="text-decoration: line-through"></span>
<br />
<span v-if="Date.now() - new Date(entry.reviewStarted) >= maxReviewTime">pastdue </span>
<span>abandoned </span>
<span>{{ ((Date.now() - new Date(entry.reviewStarted)) / 1000 / 60 / 60).toFixed(2) }} hours ago</span>
</td>
<td style="vertical-align: middle; text-align: right; padding-right: 15px">
<a :href="ROUTES.parse('REVIEWS_SHOW_REVIEWS', entry.author, entry.slug, entry.versionStringUrl)">
<i class="fas fa-2x fa-fw fa-info"></i>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title" v-text="$t('user.queue.open')"></h3>
</div>
<table class="table table-hover mb-0">
<thead>
<tr>
<th></th>
<th>Project</th>
<th>Version</th>
<th>Queued by</th>
<th style="text-align: right">Status</th>
</tr>
</thead>
<tbody>
<tr v-if="!notStarted.length">
<th rowspan="5">
<h4><i class="fas fa-thumbs-o-up"></i> {{ $t('user.queue.none') }}</h4>
</th>
</tr>
<tr v-for="entry in notStarted" :key="entry.namespace + '/' + entry.versionStringUrl">
<td>
<UserAvatar :user-name="entry.author" clazz="user-avatar-xs" />
</td>
<td>
<a :href="ROUTES.parse('VERSIONS_SHOW', entry.author, entry.slug, entry.versionStringUrl)" v-text="entry.namespace"></a>
</td>
<td>
<span class="faint">{{ new Date(entry.versionCreatedAt).toLocaleDateString() }}&nbsp;</span>
<span class="minor">{{ entry.versionString }}&nbsp;</span>
<span class="channel" :style="{ backgroundColor: entry.channelColor.hex }">{{ entry.channelName }}</span>
</td>
<td>
<a v-if="entry.versionAuthor" :href="`https://papermc.io/forums/users/${entry.versionAuthor}`" v-text="entry.versionAuthor"></a>
</td>
<td>
<a
class="btn btn-success float-right"
:href="ROUTES.parse('REVIEWS_SHOW_REVIEWS', entry.author, entry.slug, entry.versionStringUrl)"
>
Start Review
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</template>
<script>
import UserAvatar from '@/components/UserAvatar';
export default {
name: 'VersionQueue',
components: { UserAvatar },
data() {
return {
ROUTES: window.ROUTES,
maxReviewTime: window.MAX_REVIEW_TIME,
currentUser: window.CURRENT_USER,
notStarted: window.NOT_STARTED.sort((a, b) => new Date(a.versionCreatedAt) - new Date(b.versionCreatedAt)),
underReview: window.UNDER_REVIEW,
};
},
created() {
console.log(this.maxReviewTime);
},
};
</script>

View File

@ -0,0 +1,6 @@
import { createApp } from 'vue';
import { setupI18n } from '@/plugins/i18n';
import VersionQueue from '@/components/entrypoints/admin/VersionQueue';
const i18n = setupI18n();
createApp(VersionQueue).use(i18n).mount('#version-queue');

View File

@ -1,45 +0,0 @@
import $ from 'jquery';
import moment from 'moment';
import { clearUnread, toggleSpinner } from '@/utils';
//=====> EXTERNAL CONSTANTS
const MAX_REVIEW_TIME = window.MAX_REVIEW_TIME;
//=====> DOCUMENT READY
$(function () {
var momentNow = moment();
var maxDifference = MAX_REVIEW_TIME;
$('span[data-ago]').each(function () {
var momentAgo = moment($(this).data('ago'));
$(this).text($(this).data('title') + momentAgo.fromNow());
if (momentNow.diff(momentAgo) >= maxDifference) {
$(this)
.text('pastdue ' + momentAgo.fromNow())
.css('color', 'darkred');
$(this).parent().parent().find('.status').removeClass().addClass('status far fa-fw fa-clock fa-2x').css('color', 'darkred');
}
});
$('.btn-approve').click(function () {
var listItem = $(this).closest('.list-group-item');
var versionPath = listItem.data('version');
toggleSpinner($(this).find('[data-fa-i2svg]').removeClass('fa-thumbs-up'));
$.ajax({
type: 'post',
url: '/' + versionPath + '/approve',
complete: function () {
toggleSpinner($('.btn-approve').find('[data-fa-i2svg]').addClass('fa-thumbs-up'));
},
success: function () {
$.when(listItem.fadeOut('slow')).done(function () {
listItem.remove();
if (!$('.list-versions').find('li').length) {
$('.no-versions').fadeIn();
clearUnread($('a[href="/admin/queue"]'));
}
});
},
});
});
});

View File

@ -5,161 +5,16 @@
<#assign scriptsVar>
<script nonce="${nonce}">
<#outputformat "JavaScript">
window.MAX_REVIEW_TIME = ${config.queue.maxReviewTime.toMillis()};
window.MAX_REVIEW_TIME = ${mapper.valueToTree(config.queue.maxReviewTime.toMillis())};
window.CURRENT_USER = ${mapper.valueToTree(cu)};
window.UNDER_REVIEW = ${mapper.valueToTree(underReview)};
window.NOT_STARTED = ${mapper.valueToTree(versions)};
</#outputformat>
</script>
<script type="text/javascript" src="${hangar.url("js/queue.js")}"></script>
<script type="text/javascript" src="${hangar.url("js/version-queue.js")}"></script>
</#assign>
<#assign message><@spring.message "user.queue" /></#assign>
<@base.base title="${message}" additionalScripts=scriptsVar>
<div class="row">
<div class="col-md-12 header-flags">
<h2><@spring.message "user.queue.progress" /></h2>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h4 class="card-title float-left"><@spring.message "user.queue.progress" /></h4>
<div class="clearfix"></div>
</div>
<table class="table table-hover">
<thead>
<tr>
<th>Project version</th>
<th>Queued by</th>
<th style="text-align: right; max-width: 40px"></th>
<th>Status</th>
<th ></th>
</tr>
</thead>
<tbody>
<#if !underReview?has_content>
<tr>
<th rowspan="5">
<h3><@spring.message "queue.review.none" /></h3>
</th>
</tr>
</#if>
<#list underReview as entry>
<tr <#if entry.unfinished && headerData.isCurrentUser(entry.reviewerId)>class="warning"</#if>>
<td>
<a href="${Routes.VERSIONS_SHOW.getRouteUrl(entry.author, entry.slug, entry.versionStringUrl)}">
${entry.namespace}
</a>
<br>
${entry.versionString}
<span class="channel" style="background-color: ${entry.channelColor.hex}">${entry.channelName}</span>
</td>
<td>
<#if entry.versionAuthor??>
<a href="https://papermc.io/forums/users/${entry.versionAuthor}">
${entry.versionAuthor}
</a>
<#else>
Unknown
</#if>
<br>
${utils.prettifyDateTime(entry.versionCreatedAt)}
</td>
<td style="text-align: right; max-width: 40px">
<#if entry.unfinished>
<#if headerData.isCurrentUser(entry.reviewerId)>
<i class="status fas fa-fw fa-play-circle fa-2x" style="color: green"></i>
<#else>
<i class="status fas fa-fw fa-cog fa-2x" style="color: black"></i>
</#if>
<#else>
<i class="status fas fa-fw fa-pause-circle fa-2x" style="color: orange"></i>
</#if>
</td>
<td <#if entry.unfinished>style="color: darkred"</#if> >
<#if entry.unfinished>
${entry.reviewerName}
<br>
<span data-ago="${entry.reviewStarted.toInstant().toEpochMilli()}" data-title="started "></span>
<#else>
<strike>${entry.reviewerName}</strike>
<br>
<span data-ago="${entry.reviewStarted.toInstant().toEpochMilli()}" data-title="abandoned "></span>
</#if>
</td>
<td style="vertical-align: middle; text-align: right; padding-right: 15px;">
<a href="/${utils.urlEncode(entry.author)}/${utils.urlEncode(entry.slug)}/versions/${entry.versionString}/reviews"><i class="fas fa-2x fa-fw fa-info"></i></a>
</td>
</tr>
</#list>
</tbody>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12 header-flags">
<h2><@spring.message "user.queue.open" /></h2>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h4 class="card-title float-left"><@spring.message "user.queue.open" /></h4>
<div class="clearfix"></div>
</div>
<table class="table table-hover">
<thead>
<tr>
<th></th>
<th>Project</th>
<th>Version</th>
<th>Queued by</th>
<th style="text-align: right">Status</th>
</tr>
</thead>
<tbody>
<#if !versions?has_content>
<tr>
<th rowspan="5">
<h3><i class="fas fa-thumbs-o-up"></i> <@spring.message "user.queue.none" /></h3>
</th>
</tr>
</#if>
<#list versions?sort_by("versionCreatedAt") as entry>
<tr data-version="${utils.urlEncode(entry.author)}/${utils.urlEncode(entry.slug)}/versions/${entry.versionString}">
<td>
<#import "*/utils/userAvatar.ftlh" as userAvatar>
<@userAvatar.userAvatar userName=entry.author avatarUrl=utils.avatarUrl(entry.author) clazz="user-avatar-xs"></@userAvatar.userAvatar>
</td>
<td>
<a href="${Routes.VERSIONS_SHOW.getRouteUrl(entry.author, entry.slug, entry.versionStringUrl)}">
${entry.namespace}
</a>
</td>
<td>
<span class="faint">${utils.prettifyDateTime(entry.versionCreatedAt)}</span>
<span class="minor">${entry.versionString}</span>
<span class="channel" style="background-color: ${entry.channelColor.hex};">${entry.channelName}</span>
</td>
<td>
<#if entry.versionAuthor??>
<a href="https://papermc.io/forums/users/${entry.versionAuthor}">
${entry.versionAuthor}
</a>
</#if>
<br>
<td style="vertical-align: middle; text-align: right">
<a class="btn btn-success" href="/${utils.urlEncode(entry.author)}/${utils.urlEncode(entry.slug)}/versions/${entry.versionString}/reviews">Start review</a>
</td>
</tr>
</#list>
</tbody>
</table>
</div>
</div>
</div>
<div id="version-queue"></div>
</@base.base>