Support the 'following' option on post searches
This commit is contained in:
parent
b3ab3be3be
commit
d53fc6923f
4 changed files with 110 additions and 2 deletions
|
@ -282,6 +282,7 @@ const getNodeInfo = async ({ store }) => {
|
|||
store.dispatch('setInstanceOption', { name: 'mailerEnabled', value: metadata.mailerEnabled })
|
||||
store.dispatch('setInstanceOption', { name: 'translationEnabled', value: features.includes('akkoma:machine_translation') })
|
||||
store.dispatch('setInstanceOption', { name: 'searchTypeMediaEnabled', value: features.includes('bnakkoma:search_type_media') })
|
||||
store.dispatch('setInstanceOption', { name: 'searchOptionFollowingEnabled', value: features.includes('bnakkoma:search_option_following') })
|
||||
|
||||
const uploadLimits = metadata.uploadLimits
|
||||
store.dispatch('setInstanceOption', { name: 'uploadlimit', value: parseInt(uploadLimits.general) })
|
||||
|
|
|
@ -2,6 +2,7 @@ import FollowCard from '../follow_card/follow_card.vue'
|
|||
import Conversation from '../conversation/conversation.vue'
|
||||
import Status from '../status/status.vue'
|
||||
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
|
||||
import SearchFilters from './search_filters.vue'
|
||||
import map from 'lodash/map'
|
||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||
import {
|
||||
|
@ -20,7 +21,8 @@ const Search = {
|
|||
FollowCard,
|
||||
Conversation,
|
||||
Status,
|
||||
TabSwitcher
|
||||
TabSwitcher,
|
||||
SearchFilters
|
||||
},
|
||||
props: [
|
||||
'query'
|
||||
|
@ -41,7 +43,8 @@ const Search = {
|
|||
lastStatusFetchCount: 0,
|
||||
mediaOffset: 0,
|
||||
lastMediaFetchCount: 0,
|
||||
lastQuery: ''
|
||||
lastQuery: '',
|
||||
filter: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
@ -64,6 +67,9 @@ const Search = {
|
|||
},
|
||||
canSearchMediaPosts () {
|
||||
return this.$store.state.instance.searchTypeMediaEnabled === true
|
||||
},
|
||||
canSearchFollowing () {
|
||||
return this.$store.state.instance.searchOptionFollowingEnabled === true
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
|
@ -73,6 +79,13 @@ const Search = {
|
|||
query (newValue) {
|
||||
this.searchTerm = newValue
|
||||
this.search(newValue)
|
||||
},
|
||||
filter: {
|
||||
deep: true,
|
||||
handler () {
|
||||
this.lastQuery = "" // invalidate state
|
||||
this.search(this.searchTerm)
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
@ -113,6 +126,8 @@ const Search = {
|
|||
resolve: true,
|
||||
offset: searchOffset,
|
||||
'type': searchType,
|
||||
following:
|
||||
'followingOnly' in this.filter && this.filter.followingOnly
|
||||
})
|
||||
.then(data => {
|
||||
this.loading = false
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
<div class="title">
|
||||
{{ $t('nav.search') }}
|
||||
</div>
|
||||
<SearchFilters
|
||||
v-show="canSearchFollowing"
|
||||
v-model="filter"
|
||||
/>
|
||||
</div>
|
||||
<div class="search-input-container">
|
||||
<input
|
||||
|
|
88
src/components/search/search_filters.vue
Normal file
88
src/components/search/search_filters.vue
Normal file
|
@ -0,0 +1,88 @@
|
|||
<template>
|
||||
<Popover
|
||||
trigger="click"
|
||||
class="SearchFilters"
|
||||
placement="bottom"
|
||||
:bound-to="{ x: 'container' }"
|
||||
>
|
||||
<template #content>
|
||||
<div class="dropdown-menu">
|
||||
<button
|
||||
class="button-default dropdown-item"
|
||||
@click="toggleFilter('followingOnly')"
|
||||
>
|
||||
<span
|
||||
class="menu-checkbox"
|
||||
:class="{ 'menu-checkbox-checked': currentFilter.followingOnly }"
|
||||
/>{{ $t('lists.following_only') }}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
<template #trigger>
|
||||
<button class="filter-trigger-button button-unstyled">
|
||||
<FAIcon icon="filter" />
|
||||
</button>
|
||||
</template>
|
||||
</Popover>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Popover from '../popover/popover.vue'
|
||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||
import { faFilter } from '@fortawesome/free-solid-svg-icons'
|
||||
|
||||
library.add(
|
||||
faFilter
|
||||
)
|
||||
|
||||
export default {
|
||||
components: { Popover },
|
||||
props: [
|
||||
'modelValue'
|
||||
],
|
||||
emits: [
|
||||
'update:modelValue'
|
||||
],
|
||||
data () {
|
||||
return {
|
||||
currentFilter: {
|
||||
followingOnly: false
|
||||
}
|
||||
}
|
||||
},
|
||||
created () {
|
||||
for (const filterName of Object.entries(this.currentFilter)) {
|
||||
if (this.modelValue && filterName in this.modelValue) {
|
||||
this.currentFilter[filterName] = this.modelValue[filterName]
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
toggleFilter (filterName) {
|
||||
if (filterName in this.currentFilter) {
|
||||
this.currentFilter[filterName] = !this.currentFilter[filterName]
|
||||
} else {
|
||||
this.currentFilter[filterName] = true
|
||||
}
|
||||
this.$emit('update:modelValue', this.currentFilter)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.SearchFilters {
|
||||
align-self: stretch;
|
||||
|
||||
> button {
|
||||
line-height: 100%;
|
||||
height: 100%;
|
||||
width: var(--__panel-heading-height-inner);
|
||||
text-align: center;
|
||||
|
||||
svg {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
Loading…
Reference in a new issue