update
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
import { posterUrl } from '../images'
|
import { posterUrl } from '../images'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -23,9 +23,28 @@ const gruppen = computed(() => {
|
|||||||
}
|
}
|
||||||
nach.get(schluessel).filme.push(item)
|
nach.get(schluessel).filme.push(item)
|
||||||
}
|
}
|
||||||
|
for (const gruppe of nach.values()) gruppe.schluessel = gruppe.titel
|
||||||
return [...nach.values()].sort((a, b) => b.mine - a.mine)
|
return [...nach.values()].sort((a, b) => b.mine - a.mine)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Je Sammlung ein eigener Filter. Ohne Auswahl steht alles da.
|
||||||
|
const filter = ref({})
|
||||||
|
|
||||||
|
function umschalten(gruppe, wert) {
|
||||||
|
filter.value = {
|
||||||
|
...filter.value,
|
||||||
|
[gruppe.schluessel]: filter.value[gruppe.schluessel] === wert ? null : wert,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function gefiltert(gruppe) {
|
||||||
|
const wahl = filter.value[gruppe.schluessel]
|
||||||
|
if (!wahl) return gruppe.filme
|
||||||
|
return gruppe.filme.filter(
|
||||||
|
(f) => (f.genres || []).includes('Horror') === (wahl === 'horror')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const emit = defineEmits(['open', 'changed'])
|
const emit = defineEmits(['open', 'changed'])
|
||||||
|
|
||||||
async function vergessen(item) {
|
async function vergessen(item) {
|
||||||
@@ -48,11 +67,27 @@ async function oeffnen(item) {
|
|||||||
<section v-for="gruppe in gruppen" :key="gruppe.titel">
|
<section v-for="gruppe in gruppen" :key="gruppe.titel">
|
||||||
<h3>
|
<h3>
|
||||||
{{ gruppe.titel }}
|
{{ gruppe.titel }}
|
||||||
<span class="anzahl">{{ gruppe.filme.length }}</span>
|
<span class="anzahl">{{ gefiltert(gruppe).length }}</span>
|
||||||
|
<span class="schalter">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
:class="{ an: filter[gruppe.schluessel] === 'horror' }"
|
||||||
|
@click="umschalten(gruppe, 'horror')"
|
||||||
|
>
|
||||||
|
Horror
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
:class="{ an: filter[gruppe.schluessel] === 'kein' }"
|
||||||
|
@click="umschalten(gruppe, 'kein')"
|
||||||
|
>
|
||||||
|
Kein Horror
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<article v-for="item in gruppe.filme" :key="item.id" class="karte">
|
<article v-for="item in gefiltert(gruppe)" :key="item.id" class="karte">
|
||||||
<button type="button" class="cover" @click="oeffnen(item)">
|
<button type="button" class="cover" @click="oeffnen(item)">
|
||||||
<img
|
<img
|
||||||
v-if="posterUrl(item.poster_path, 'w342')"
|
v-if="posterUrl(item.poster_path, 'w342')"
|
||||||
@@ -64,8 +99,11 @@ async function oeffnen(item) {
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<h4 @click="oeffnen(item)">{{ item.title }}</h4>
|
<h5 @click="oeffnen(item)">{{ item.title }}</h5>
|
||||||
<p v-if="item.year" class="jahr">{{ item.year }}</p>
|
<p v-if="item.year" class="jahr">{{ item.year }}</p>
|
||||||
|
<p v-if="item.genres?.length" class="genres">
|
||||||
|
{{ item.genres.join(' · ') }}
|
||||||
|
</p>
|
||||||
<button
|
<button
|
||||||
v-if="item.mine"
|
v-if="item.mine"
|
||||||
type="button"
|
type="button"
|
||||||
@@ -151,13 +189,41 @@ h3 {
|
|||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h4 {
|
.schalter {
|
||||||
|
display: flex;
|
||||||
|
margin-left: 0.4rem;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schalter button {
|
||||||
|
padding: 0.2rem 0.6rem;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 0.68rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: var(--bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.schalter button.an {
|
||||||
|
color: var(--text);
|
||||||
|
background: var(--bg-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.genres {
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 0.78rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
font-size: 0.98rem;
|
font-size: 0.98rem;
|
||||||
line-height: 1.25;
|
line-height: 1.25;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
h4:hover {
|
h5:hover {
|
||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user