mirror of
https://github.com/HangarMC/Hangar.git
synced 2025-02-23 15:12:52 +08:00
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:
parent
d29c0715f7
commit
81a14f4a10
@ -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() }} </span>
|
||||
<span class="minor">{{ entry.versionString }} </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>
|
6
src/main/frontend/src/entrypoints/version-queue.js
Normal file
6
src/main/frontend/src/entrypoints/version-queue.js
Normal 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');
|
@ -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"]'));
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user