diff --git a/.nvmrc b/.nvmrc index 48b14e6..b295a68 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.14.0 +21.2.0 diff --git a/components/actors/actors.vue b/components/actors/actors.vue index 57283d0..9b8789c 100644 --- a/components/actors/actors.vue +++ b/components/actors/actors.vue @@ -135,7 +135,7 @@ const cupRange = ref(pageProps.cupRange); actors.value = pageProps.actors; const currentPage = ref(Number(routeParams.page)); -const total = ref(Number(pageProps.total)); +const total = ref(Number(pageProps.actorTotal || pageProps.total)); const order = ref(routeParams.order || urlParsed.search.order || 'likes.desc'); const filters = ref({ diff --git a/components/actors/tile.vue b/components/actors/tile.vue index 6de4452..ad7ad2a 100644 --- a/components/actors/tile.vue +++ b/components/actors/tile.vue @@ -5,8 +5,6 @@ unstashed: !favorited && pageStash && user && pageStash.user.id === user?.id, }" > - {{ actor.name }} -
-
-
- - +
+ + + + {{ actor.ageFromBirth }} + + {{ actor.ageThen }} + {{ actor.ageFromBirth }} - - {{ actor.ageThen }} - - - - {{ actor.origin.country.alpha2 }} - - + {{ actor.origin.country.alpha2 }} + + +
+ + {{ actor.name }} @@ -99,8 +99,8 @@ const favorited = ref(props.actor.stashes.some((actorStash) => actorStash.id === display: flex; flex-direction: column; width: 100%; - aspect-ratio: 2/3; position: relative; + aspect-ratio: 3/5; border-radius: .25rem; box-shadow: 0 0 3px var(--shadow-weak-30); overflow: hidden; @@ -108,10 +108,6 @@ const favorited = ref(props.actor.stashes.some((actorStash) => actorStash.id === &:hover { box-shadow: 0 0 3px var(--shadow-weak-20); - .name { - color: var(--primary); - } - :deep(.bookmarks) .icon:not(.favorited):not(:hover) { fill: var(--text-light); } @@ -124,7 +120,7 @@ const favorited = ref(props.actor.stashes.some((actorStash) => actorStash.id === .name { flex-shrink: 0; - padding: .25rem .5rem; + padding: .35rem .5rem; font-weight: bold; font-size: .9rem; white-space: nowrap; diff --git a/components/movies/tile.vue b/components/movies/tile.vue index 68952f0..cb4b570 100644 --- a/components/movies/tile.vue +++ b/components/movies/tile.vue @@ -29,7 +29,7 @@
@@ -128,7 +128,7 @@ const props = defineProps({ type: Object, default: null, }, - details: { + showDetails: { type: Boolean, default: true, }, diff --git a/components/scenes/scenes.vue b/components/scenes/scenes.vue index 7dc3a18..c8f0f74 100644 --- a/components/scenes/scenes.vue +++ b/components/scenes/scenes.vue @@ -178,7 +178,7 @@ const aggChannels = ref(pageProps.aggChannels || []); const currentPage = ref(Number(routeParams.page)); const scope = ref(routeParams.scope || props.defaultScope); -const total = ref(Number(pageProps.total)); +const total = ref(Number(pageProps.sceneTotal || pageProps.total)); const loading = ref(false); const actorIds = urlParsed.search.actors?.split(',').map((identifier) => parseActorIdentifier(identifier)?.id).filter(Boolean) || []; diff --git a/pages/scene/+Page.vue b/pages/scene/+Page.vue index ee008f7..b3691c2 100644 --- a/pages/scene/+Page.vue +++ b/pages/scene/+Page.vue @@ -181,7 +181,7 @@ v-for="movie in scene.movies" :key="`movie-${movie.id}`" :movie="movie" - :details="false" + :show-details="false" />
diff --git a/pages/search/+Page.vue b/pages/search/+Page.vue index 8cbc47f..370438e 100644 --- a/pages/search/+Page.vue +++ b/pages/search/+Page.vue @@ -1,11 +1,184 @@ + + diff --git a/pages/search/+onBeforeRender.js b/pages/search/+onBeforeRender.js index 95120af..86c5386 100644 --- a/pages/search/+onBeforeRender.js +++ b/pages/search/+onBeforeRender.js @@ -1,36 +1,66 @@ import { fetchScenes } from '#/src/scenes.js'; +import { fetchActors } from '#/src/actors.js'; +import { fetchMovies } from '#/src/movies.js'; import { curateScenesQuery } from '#/src/web/scenes.js'; +import { curateActorsQuery } from '#/src/web/actors.js'; +import { curateMoviesQuery } from '#/src/web/movies.js'; export async function onBeforeRender(pageContext) { - const searchScenes = await fetchScenes(await curateScenesQuery({ - ...pageContext.urlQuery, - query: pageContext.urlParsed.search.q, - scope: pageContext.urlParsed.search.scope || 'results', - tagFilter: pageContext.tagFilter, - }), { - page: Number(pageContext.routeParams.page) || 1, - limit: Number(pageContext.urlParsed.search.limit) || 30, - }, pageContext.user); + const [searchScenes, searchActors, searchMovies] = await Promise.all([ + fetchScenes(await curateScenesQuery({ + ...pageContext.urlQuery, + query: pageContext.urlParsed.search.q, + scope: pageContext.urlParsed.search.scope || 'results', + tagFilter: pageContext.tagFilter, + }), { + page: Number(pageContext.routeParams.page) || 1, + limit: Number(pageContext.urlParsed.search.limit) || 15, + }, pageContext.user), + fetchActors(curateActorsQuery(pageContext.urlQuery), { + page: Number(pageContext.routeParams.page) || 1, + limit: Number(pageContext.urlParsed.search.limit) || 10, + order: ['results', 'desc'], + }, pageContext.user), + fetchMovies(await curateMoviesQuery({ + ...pageContext.urlQuery, + scope: pageContext.routeParams.scope || 'results', + }), { + page: Number(pageContext.routeParams.page) || 1, + limit: Number(pageContext.urlParsed.search.limit) || 5, + }, pageContext.user), + ]); const { scenes, aggActors, aggTags, aggChannels, - total, - limit, + total: sceneTotal, } = searchScenes; + const { + actors, + total: actorTotal, + } = searchActors; + + const { + movies, + total: movieTotal, + } = searchMovies; + return { pageContext: { title: `Search '${pageContext.urlParsed.search.q || ''}'`, pageProps: { + actors, scenes, + movies, aggActors, aggTags, aggChannels, - limit, - total, + sceneTotal, + actorTotal, + movieTotal, }, }, }; diff --git a/pages/updates/+Page.vue b/pages/updates/+Page.vue index 143af65..d4bfda4 100644 --- a/pages/updates/+Page.vue +++ b/pages/updates/+Page.vue @@ -1,13 +1,18 @@ diff --git a/pages/updates/+onBeforeRender.js b/pages/updates/+onBeforeRender.js index 3fa1300..d437bb2 100644 --- a/pages/updates/+onBeforeRender.js +++ b/pages/updates/+onBeforeRender.js @@ -2,15 +2,24 @@ import { fetchScenes } from '#/src/scenes.js'; import { curateScenesQuery } from '#/src/web/scenes.js'; export async function onBeforeRender(pageContext) { - const { scenes, limit, total } = await fetchScenes(await curateScenesQuery({ + const withQuery = Object.hasOwn(pageContext.urlParsed.search, 'q'); + + const { + scenes, + aggTags, + aggChannels, + aggActors, + limit, + total, + } = await fetchScenes(await curateScenesQuery({ ...pageContext.urlQuery, scope: pageContext.routeParams.scope || 'latest', - isShowcased: true, + isShowcased: withQuery ? null : true, tagFilter: pageContext.tagFilter, }), { page: Number(pageContext.routeParams.page) || 1, limit: Number(pageContext.urlParsed.search.limit) || 30, - aggregate: false, + aggregate: withQuery, }, pageContext.user); return { @@ -18,6 +27,9 @@ export async function onBeforeRender(pageContext) { title: pageContext.routeParams.scope, pageProps: { scenes, + aggTags, + aggChannels, + aggActors, limit, total, }, diff --git a/src/actors.js b/src/actors.js index 65d681f..b296c82 100644 --- a/src/actors.js +++ b/src/actors.js @@ -446,6 +446,7 @@ async function queryManticoreSql(filters, options, _reqUser) { } else if (options.order?.[0] === 'results') { builder.orderBy([ { column: '_score', order: options.order[1] }, + { column: 'actors.stashed', order: 'desc' }, { column: 'actors.slug', order: 'asc' }, ]); } else if (options.order?.[0] === 'stashed' && filters.stashId) { diff --git a/src/movies.js b/src/movies.js index 28cd8a3..7d10f16 100644 --- a/src/movies.js +++ b/src/movies.js @@ -433,6 +433,7 @@ async function queryManticoreSql(filters, options) { } else if (filters.scope === 'results') { builder.orderBy([ { column: '_score', order: 'desc' }, + { column: 'movies.stashed', order: 'desc' }, { column: 'movies.effective_date', order: 'desc' }, ]); } else if (filters.scope === 'stashed' && filters.stashId) { diff --git a/src/scenes.js b/src/scenes.js index ee730c6..de9042b 100644 --- a/src/scenes.js +++ b/src/scenes.js @@ -533,6 +533,7 @@ async function queryManticoreSql(filters, options, _reqUser) { } else if (filters.scope === 'results') { builder.orderBy([ { column: '_score', order: 'desc' }, + { column: 'scenes.stashed', order: 'desc' }, { column: 'scenes.effective_date', order: 'desc' }, ]); } else if (filters.scope === 'stashed' && filters.stashId) {