Added basic co-star actor filter to actor page.

This commit is contained in:
DebaucheryLibrarian
2020-09-12 03:09:05 +02:00
parent 24fb267b40
commit 62f5d5111a
7 changed files with 155 additions and 6 deletions

View File

@@ -0,0 +1,86 @@
<template>
<v-popover class="filter-container">
<div class="filter">
<Icon icon="users" />
<div
v-if="selectedActors.length > 0"
class="filter-applied"
>{{ selectedActors.length }} {{ selectedActors.length > 1 ? 'actors' : 'actor' }}</div>
<div
v-else
class="filter-applied empty"
>Actors</div>
</div>
<div slot="popover">
<router-link
class="filter-clear"
:to="{ query: { ...$route.query, actors: undefined } }"
:class="{ active: selectedActors.length > 0 }"
>clear all<Icon icon="cross2" /></router-link>
<ul class="filter-items nolist">
<li
v-for="actor in availableActors"
:key="actor.id"
class="filter-item"
:class="{ selected: selectedActors.includes(actor.slug) }"
>
<router-link
:to="{ query: {
...$route.query,
actors: actor.slug,
}, params: { pageNumber: 1 } }"
class="filter-name"
>{{ actor.name }}</router-link>
<router-link
:to="{ query: { ...$route.query, ...getNewRange(actor) }, params: { pageNumber: 1 } }"
class="filter-include"
>
<Icon
icon="checkmark"
class="filter-add"
/>
<Icon
icon="cross2"
class="filter-remove"
/>
</router-link>
</li>
</ul>
</div>
</v-popover>
</template>
<script>
function getNewRange(actor) {
if (this.selectedActors.includes(actor.slug)) {
return { actors: this.selectedActors.filter(selectedActor => selectedActor !== actor.slug).join(',') || undefined };
}
return { actors: this.selectedActors.concat(actor.slug).join(',') };
}
function selectedActors() {
return this.$route.query.actors ? this.$route.query.actors.split(',') : [];
}
export default {
props: {
availableActors: {
type: Array,
default: () => [],
},
},
computed: {
selectedActors,
},
methods: {
getNewRange,
},
};
</script>

View File

@@ -42,7 +42,7 @@
class="filter-name"
>
<img
v-if="channel.independent || !channel.parent"
v-if="channel.type === 'network' || channel.independent || !channel.parent "
:src="`/img/logos/${channel.slug}/favicon.png`"
class="favicon"
>
@@ -109,7 +109,7 @@ function selectedNetworks() {
function channelsPerNetwork() {
const networks = this.availableChannels.reduce((acc, channel) => {
if (channel.independent || !channel.parent) {
if (channel.type === 'network' || channel.independent || !channel.parent) {
acc[channel.slug] = { ...channel, children: [] };
return acc;
}

View File

@@ -21,6 +21,12 @@
</div>
<div class="filters">
<ActorFilter
class="filters-filter"
:filter="filter"
:available-actors="availableActors"
/>
<ChannelFilter
class="filters-filter"
:filter="filter"
@@ -38,6 +44,8 @@
<script>
import { mapState } from 'vuex';
import ActorFilter from './actor-filter.vue';
import ChannelFilter from './channel-filter.vue';
import TagFilter from './tag-filter.vue';
@@ -67,6 +75,7 @@ async function setBatch(newBatch) {
export default {
components: {
ActorFilter,
ChannelFilter,
TagFilter,
},
@@ -95,6 +104,10 @@ export default {
type: Array,
default: () => [],
},
availableActors: {
type: Array,
default: () => [],
},
},
computed: {
...mapState({
@@ -253,7 +266,7 @@ export default {
background: var(--darken-hint);
}
@media(max-width: $breakpoint-micro) {
@media(max-width: $breakpoint-small) {
.filter-applied {
display: none;
}