Merge pull request #1338 from Human-Connection/1335-filter_bubble_indicator

Implement visual feedback if filter is active
This commit is contained in:
mattwr18 2019-08-23 08:38:42 +02:00 committed by GitHub
commit 6e0f77fc5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 40 additions and 10 deletions

View File

@ -54,6 +54,7 @@ describe('FilterPosts.vue', () => {
'postsFilter/TOGGLE_CATEGORY': jest.fn(), 'postsFilter/TOGGLE_CATEGORY': jest.fn(),
} }
getters = { getters = {
'postsFilter/isActive': () => false,
'auth/user': () => { 'auth/user': () => {
return { id: 'u34' } return { id: 'u34' }
}, },
@ -63,7 +64,7 @@ describe('FilterPosts.vue', () => {
const openFilterPosts = () => { const openFilterPosts = () => {
const store = new Vuex.Store({ mutations, getters }) const store = new Vuex.Store({ mutations, getters })
const wrapper = mount(FilterPosts, { mocks, localVue, propsData, store }) const wrapper = mount(FilterPosts, { mocks, localVue, propsData, store })
menuToggle = wrapper.findAll('a').at(0) menuToggle = wrapper.findAll('button').at(0)
menuToggle.trigger('click') menuToggle.trigger('click')
return wrapper return wrapper
} }
@ -81,13 +82,13 @@ describe('FilterPosts.vue', () => {
it('starts with all categories button active', () => { it('starts with all categories button active', () => {
const wrapper = openFilterPosts() const wrapper = openFilterPosts()
allCategoriesButton = wrapper.findAll('button').at(0) allCategoriesButton = wrapper.findAll('button').at(1)
expect(allCategoriesButton.attributes().class).toContain('ds-button-primary') expect(allCategoriesButton.attributes().class).toContain('ds-button-primary')
}) })
it('calls TOGGLE_CATEGORY when clicked', () => { it('calls TOGGLE_CATEGORY when clicked', () => {
const wrapper = openFilterPosts() const wrapper = openFilterPosts()
environmentAndNatureButton = wrapper.findAll('button').at(1) environmentAndNatureButton = wrapper.findAll('button').at(2)
environmentAndNatureButton.trigger('click') environmentAndNatureButton.trigger('click')
expect(mutations['postsFilter/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat4') expect(mutations['postsFilter/TOGGLE_CATEGORY']).toHaveBeenCalledWith({}, 'cat4')
}) })
@ -95,7 +96,7 @@ describe('FilterPosts.vue', () => {
it('sets category button attribute `primary` when corresponding category is filtered', () => { it('sets category button attribute `primary` when corresponding category is filtered', () => {
getters['postsFilter/filteredCategoryIds'] = jest.fn(() => ['cat9']) getters['postsFilter/filteredCategoryIds'] = jest.fn(() => ['cat9'])
const wrapper = openFilterPosts() const wrapper = openFilterPosts()
democracyAndPoliticsButton = wrapper.findAll('button').at(3) democracyAndPoliticsButton = wrapper.findAll('button').at(4)
expect(democracyAndPoliticsButton.attributes().class).toContain('ds-button-primary') expect(democracyAndPoliticsButton.attributes().class).toContain('ds-button-primary')
}) })

View File

@ -1,9 +1,15 @@
<template> <template>
<dropdown ref="menu" :placement="placement" :offset="offset"> <dropdown ref="menu" :placement="placement" :offset="offset">
<a slot="default" slot-scope="{ toggleMenu }" href="#" @click.prevent="toggleMenu()"> <ds-button
<ds-icon style="margin: 12px 0px 0px 10px;" name="filter" size="large" /> slot="default"
<ds-icon style="margin: 7px 0px 0px 2px" size="xx-small" name="angle-down" /> icon="filter"
</a> :primary="filterActive"
:ghost="!filterActive"
slot-scope="{ toggleMenu }"
@click.prevent="toggleMenu()"
>
<ds-icon size="xx-small" name="angle-down" />
</ds-button>
<template slot="popover"> <template slot="popover">
<filter-posts-menu-items :chunk="chunk" :user="currentUser" /> <filter-posts-menu-items :chunk="chunk" :user="currentUser" />
</template> </template>
@ -28,6 +34,7 @@ export default {
computed: { computed: {
...mapGetters({ ...mapGetters({
currentUser: 'auth/user', currentUser: 'auth/user',
filterActive: 'postsFilter/isActive',
}), }),
chunk() { chunk() {
return _.chunk(this.categories, 2) return _.chunk(this.categories, 2)

View File

@ -3,7 +3,7 @@
<div class="main-navigation"> <div class="main-navigation">
<ds-container class="main-navigation-container" style="padding: 10px 10px;"> <ds-container class="main-navigation-container" style="padding: 10px 10px;">
<div> <div>
<ds-flex class="main-navigation-flex"> <ds-flex class="main-navigation-flex" centered>
<ds-flex-item :width="{ lg: '3.5%' }" /> <ds-flex-item :width="{ lg: '3.5%' }" />
<ds-flex-item :width="{ base: '80%', sm: '80%', md: '80%', lg: '15%' }"> <ds-flex-item :width="{ base: '80%', sm: '80%', md: '80%', lg: '15%' }">
<a @click="redirectToRoot"> <a @click="redirectToRoot">
@ -293,6 +293,11 @@ export default {
padding-top: 6rem; padding-top: 6rem;
padding-bottom: 5rem; padding-bottom: 5rem;
} }
.main-navigation-flex {
align-items: center;
}
.main-navigation { .main-navigation {
a { a {
color: $text-color-soft; color: $text-color-soft;

View File

@ -2,11 +2,16 @@ import get from 'lodash/get'
import update from 'lodash/update' import update from 'lodash/update'
import xor from 'lodash/xor' import xor from 'lodash/xor'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import isEqual from 'lodash/isEqual'
import clone from 'lodash/clone' import clone from 'lodash/clone'
const defaultFilter = {}
export const state = () => { export const state = () => {
return { return {
filter: {}, filter: {
...defaultFilter,
},
} }
} }
@ -38,6 +43,9 @@ export const mutations = {
} }
export const getters = { export const getters = {
isActive(state) {
return !isEqual(state.filter, defaultFilter)
},
postsFilter(state) { postsFilter(state) {
return state.filter return state.filter
}, },

View File

@ -4,6 +4,15 @@ let state
let testAction let testAction
describe('getters', () => { describe('getters', () => {
describe('isActive', () => {
it('returns true if filter differs from default setting', () => {
state = { filter: {} }
expect(getters.isActive(state)).toEqual(false)
state = { filter: { categories_some: { id_in: [24] } } }
expect(getters.isActive(state)).toEqual(true)
})
})
describe('filteredCategoryIds', () => { describe('filteredCategoryIds', () => {
it('returns category ids if filter is set', () => { it('returns category ids if filter is set', () => {
state = { filter: { categories_some: { id_in: [24] } } } state = { filter: { categories_some: { id_in: [24] } } }