dev→main: showcase cascade + filter styling + DB maintenance + gallery filter Phase 2 + showcase decode-gate + CI perf #62

Merged
bvandeusen merged 14 commits from dev into main 2026-06-04 08:27:47 -04:00
2 changed files with 15 additions and 12 deletions
Showing only changes of commit ae569c0f9a - Show all commits
+8 -8
View File
@@ -431,10 +431,10 @@ class GalleryService:
column predicate on ImageRecord.
"""
_require_single_filter(tag_ids, post_id, artist_id)
common = dict(
tag_ids=tag_ids, post_id=post_id,
artist_id=artist_id, media_type=media_type,
)
common = {
"tag_ids": tag_ids, "post_id": post_id,
"artist_id": artist_id, "media_type": media_type,
}
# total — the full active filter (the headline result count).
total = (await self.session.execute(
@@ -448,10 +448,10 @@ class GalleryService:
# platforms — scope minus the platform selection. Inner-join
# provenance→source and COUNT(DISTINCT image) per platform (a
# cross-posted image counts under each of its platforms).
plat_scope = dict(
common, untagged=untagged, no_artist=no_artist,
date_from=date_from, date_to=date_to,
)
plat_scope = {
**common, "untagged": untagged, "no_artist": no_artist,
"date_from": date_from, "date_to": date_to,
}
src = aliased(Source)
plat_stmt = (
select(src.platform, func.count(distinct(ImageRecord.id)))
@@ -79,7 +79,7 @@
</template>
<script setup>
import { computed, ref } from 'vue'
import { computed, ref, watch } from 'vue'
import { useRouter } from 'vue-router'
import { useApi } from '../../composables/useApi.js'
import { cloneFilter, filterToQuery, useGalleryStore } from '../../stores/gallery.js'
@@ -117,9 +117,12 @@ const hasActiveFilters = computed(() =>
hasRefineFilters.value
)
// Auto-open the panel when arriving with refine filters already in the URL
// (deep-link / back button) so the active facets are visible, not hidden.
const refineOpen = ref(hasRefineFilters.value)
// Auto-open the panel when refine filters are present in the URL (deep-link /
// back button). The parent applies the query in its onMounted — after this
// child has set up — so watch for the transition rather than reading the
// initial (still-default) filter state.
const refineOpen = ref(false)
watch(hasRefineFilters, (v) => { if (v) refineOpen.value = true })
function toggleRefine() {
// The panel fetches facets itself on mount (and refetches on filter change);
// opening it is enough.