Fixed SQL total and pagination, showing end of result info. Hiding heart from scene tiles when not logged in.
This commit is contained in:
parent
3f36c0ae0a
commit
3238e678ef
|
@ -1,81 +1,88 @@
|
|||
<template>
|
||||
<nav class="pagination">
|
||||
<ul class="pages nolist">
|
||||
<li>
|
||||
<Link
|
||||
:href="getPath(1)"
|
||||
:class="{ disabled: !hasPrevPage }"
|
||||
class="page first nolink"
|
||||
@click="(event) => go(1, event)"
|
||||
><Icon icon="first2" /></Link>
|
||||
</li>
|
||||
<div class="pagination-container">
|
||||
<div
|
||||
v-if="currentPage === pageTotal && total > env.maxMatches"
|
||||
class="more"
|
||||
>Results are truncated, apply a filter to find more.</div>
|
||||
|
||||
<li>
|
||||
<Link
|
||||
:href="hasPrevPage ? getPath(currentPage - 1) : null"
|
||||
:class="{ disabled: !hasPrevPage }"
|
||||
class="page prev nolink"
|
||||
@click="(event) => hasPrevPage && go(currentPage - 1, event)"
|
||||
><Icon icon="arrow-left" /></Link>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="index">
|
||||
<ul class="pages before wrap nolist">
|
||||
<li
|
||||
v-for="prevPage in prevPages"
|
||||
:key="`page-${prevPage}`"
|
||||
>
|
||||
<nav class="pagination">
|
||||
<ul class="pages nolist">
|
||||
<li>
|
||||
<Link
|
||||
:href="getPath(prevPage)"
|
||||
:class="{ active: prevPage === currentPage }"
|
||||
class="page nolink"
|
||||
@click="(event) => go(prevPage, event)"
|
||||
>{{ prevPage }}</Link>
|
||||
:href="getPath(1)"
|
||||
:class="{ disabled: !hasPrevPage }"
|
||||
class="page first nolink"
|
||||
@click="(event) => go(1, event)"
|
||||
><Icon icon="first2" /></Link>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<Link
|
||||
:href="hasPrevPage ? getPath(currentPage - 1) : null"
|
||||
:class="{ disabled: !hasPrevPage }"
|
||||
class="page prev nolink"
|
||||
@click="(event) => hasPrevPage && go(currentPage - 1, event)"
|
||||
><Icon icon="arrow-left" /></Link>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="index">
|
||||
<ul class="pages before wrap nolist">
|
||||
<li
|
||||
v-for="prevPage in prevPages"
|
||||
:key="`page-${prevPage}`"
|
||||
>
|
||||
<Link
|
||||
:href="getPath(prevPage)"
|
||||
:class="{ active: prevPage === currentPage }"
|
||||
class="page nolink"
|
||||
@click="(event) => go(prevPage, event)"
|
||||
>{{ prevPage }}</Link>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="pages nolist">
|
||||
<li>
|
||||
<div class="page active">{{ currentPage }}</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="pages after wrap nolist">
|
||||
<li
|
||||
v-for="nextPage in nextPages"
|
||||
:key="`page-${nextPage}`"
|
||||
>
|
||||
<Link
|
||||
:href="getPath(nextPage)"
|
||||
:class="{ active: nextPage === currentPage }"
|
||||
class="page nolink"
|
||||
@click="(event) => go(nextPage, event)"
|
||||
>{{ nextPage }}</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<ul class="pages nolist">
|
||||
<li>
|
||||
<div class="page active">{{ currentPage }}</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="pages after wrap nolist">
|
||||
<li
|
||||
v-for="nextPage in nextPages"
|
||||
:key="`page-${nextPage}`"
|
||||
>
|
||||
<Link
|
||||
:href="getPath(nextPage)"
|
||||
:class="{ active: nextPage === currentPage }"
|
||||
class="page nolink"
|
||||
@click="(event) => go(nextPage, event)"
|
||||
>{{ nextPage }}</Link>
|
||||
:href="hasNextPage ? getPath(currentPage + 1) : null"
|
||||
:class="{ disabled: !hasNextPage }"
|
||||
class="page next nolink"
|
||||
@click="(event) => hasNextPage && go(currentPage + 1, event)"
|
||||
><Icon icon="arrow-right" /></Link>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<Link
|
||||
:href="getPath(pageTotal)"
|
||||
:class="{ disabled: !hasNextPage }"
|
||||
class="page last nolink"
|
||||
@click="(event) => go(pageTotal, event)"
|
||||
><Icon icon="last2" /></Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<ul class="pages nolist">
|
||||
<li>
|
||||
<Link
|
||||
:href="hasNextPage ? getPath(currentPage + 1) : null"
|
||||
:class="{ disabled: !hasNextPage }"
|
||||
class="page next nolink"
|
||||
@click="(event) => hasNextPage && go(currentPage + 1, event)"
|
||||
><Icon icon="arrow-right" /></Link>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<Link
|
||||
:href="getPath(pageTotal)"
|
||||
:class="{ disabled: !hasNextPage }"
|
||||
class="page last nolink"
|
||||
@click="(event) => go(pageTotal, event)"
|
||||
><Icon icon="last2" /></Link>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</nav>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
@ -103,18 +110,28 @@ const props = defineProps({
|
|||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
useMaxMatches: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
});
|
||||
|
||||
const emit = defineEmits(['navigation']);
|
||||
|
||||
const pageContext = inject('pageContext');
|
||||
const { routeParams, urlParsed, pageProps } = pageContext;
|
||||
|
||||
const {
|
||||
routeParams,
|
||||
urlParsed,
|
||||
pageProps,
|
||||
env,
|
||||
} = pageContext;
|
||||
|
||||
const currentPage = computed(() => props.page || Number(routeParams?.page));
|
||||
|
||||
const limit = computed(() => props.limit || Number(pageProps.limit) || 30);
|
||||
const total = computed(() => props.total || Number(pageProps.total));
|
||||
const pageTotal = computed(() => Math.ceil(total.value / limit.value));
|
||||
const pageTotal = computed(() => Math.ceil((props.useMaxMatches ? Math.min(total.value, env.maxMatches) : total.value) / limit.value));
|
||||
|
||||
const hasNextPage = computed(() => currentPage.value + 1 <= pageTotal.value);
|
||||
const hasPrevPage = computed(() => currentPage.value - 1 >= 1);
|
||||
|
@ -179,6 +196,12 @@ function getPath(page) {
|
|||
</script>
|
||||
|
||||
<style scoped>
|
||||
.pagination-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
height: 5rem;
|
||||
display: flex;
|
||||
|
@ -242,4 +265,11 @@ function getPath(page) {
|
|||
.next {
|
||||
margin-left: .5rem;
|
||||
}
|
||||
|
||||
.more {
|
||||
padding: 2rem;
|
||||
text-align: center;
|
||||
color: var(--shadow-strong-10);
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -169,8 +169,6 @@ const scope = ref(routeParams.scope || props.defaultScope);
|
|||
const total = ref(Number(pageProps.total));
|
||||
const loading = ref(false);
|
||||
|
||||
console.log('SCOPE', routeParams.scope, scope.value);
|
||||
|
||||
const actorIds = urlParsed.search.actors?.split(',').map((identifier) => parseActorIdentifier(identifier)?.id).filter(Boolean) || [];
|
||||
const queryActors = actorIds.map((urlActorId) => aggActors.value.find((aggActor) => aggActor.id === urlActorId)).filter(Boolean);
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
/>
|
||||
|
||||
<Icon
|
||||
v-show="!favorited"
|
||||
v-show="!favorited && user"
|
||||
icon="heart8"
|
||||
class="heart"
|
||||
@click.native.stop="stash"
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import config from 'config';
|
||||
import { differenceInYears } from 'date-fns';
|
||||
import { unit } from 'mathjs';
|
||||
|
||||
|
@ -272,6 +273,10 @@ export async function fetchActors(filters, rawOptions) {
|
|||
sort: [{ country: { order: 'asc' } }],
|
||||
},
|
||||
},
|
||||
options: {
|
||||
max_matches: config.database.manticore.maxMatches,
|
||||
max_query_time: config.database.manticore.maxQueryTime,
|
||||
},
|
||||
});
|
||||
|
||||
const actorIds = result.hits.hits.map((hit) => Number(hit._id));
|
||||
|
|
|
@ -377,7 +377,8 @@ async function queryManticoreSql(filters, options, _reqUser) {
|
|||
max_query_time=:maxQueryTime:
|
||||
:actorsFacet:
|
||||
:tagsFacet:
|
||||
:channelsFacet:
|
||||
:channelsFacet:;
|
||||
show meta;
|
||||
`, {
|
||||
query: knexManticore(filters.stashId ? 'scenes_stashed' : 'scenes')
|
||||
.modify((builder) => {
|
||||
|
@ -459,6 +460,7 @@ async function queryManticoreSql(filters, options, _reqUser) {
|
|||
}
|
||||
})
|
||||
.limit(options.limit)
|
||||
.offset((options.page - 1) * options.limit)
|
||||
.toString(),
|
||||
// option threads=1 fixes actors, but drastically slows down performance, wait for fix
|
||||
actorsFacet: options.aggregateActors ? knex.raw('facet scenes.actor_ids order by count(*) desc limit ?', [aggSize]) : null,
|
||||
|
@ -496,9 +498,11 @@ async function queryManticoreSql(filters, options, _reqUser) {
|
|||
?.data.map((row) => ({ key: row.channel_id || row['scenes.channel_id'], doc_count: row['count(*)'] }))
|
||||
|| [];
|
||||
|
||||
const total = results.at(-1).data.find((entry) => entry.Variable_name === 'total_found').Value;
|
||||
|
||||
return {
|
||||
scenes: results[0].data,
|
||||
total: results[0].total,
|
||||
total,
|
||||
aggregations: {
|
||||
actorIds,
|
||||
tagIds,
|
||||
|
@ -546,6 +550,8 @@ export async function fetchScenes(filters, rawOptions, reqUser) {
|
|||
const scenes = await fetchScenesById(sceneIds, reqUser);
|
||||
console.timeEnd('fetch full');
|
||||
|
||||
console.log('total', result.total);
|
||||
|
||||
return {
|
||||
scenes,
|
||||
aggActors,
|
||||
|
|
|
@ -148,6 +148,7 @@ export default async function initServer() {
|
|||
env: {
|
||||
allowLogin: config.auth.login,
|
||||
allowSignup: config.auth.signup,
|
||||
maxMatches: config.database.manticore.maxMatches,
|
||||
maxAggregateSize: config.database.manticore.maxAggregateSize,
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue