diff --git a/webapp/assets/_new/icons/svgs/book.svg b/webapp/assets/_new/icons/svgs/book.svg new file mode 100644 index 000000000..305e367ac --- /dev/null +++ b/webapp/assets/_new/icons/svgs/book.svg @@ -0,0 +1,5 @@ + + +book + + diff --git a/webapp/assets/_new/icons/svgs/calendar.svg b/webapp/assets/_new/icons/svgs/calendar.svg new file mode 100644 index 000000000..5a67a8299 --- /dev/null +++ b/webapp/assets/_new/icons/svgs/calendar.svg @@ -0,0 +1,5 @@ + + +calendar + + diff --git a/webapp/components/FilterMenu/CategoriesFilter.vue b/webapp/components/FilterMenu/CategoriesFilter.vue index bcbfc7d1c..8b96245fd 100644 --- a/webapp/components/FilterMenu/CategoriesFilter.vue +++ b/webapp/components/FilterMenu/CategoriesFilter.vue @@ -17,18 +17,22 @@ @@ -95,3 +99,13 @@ export default { }, } + diff --git a/webapp/components/FilterMenu/FilterMenuComponent.vue b/webapp/components/FilterMenu/FilterMenuComponent.vue index 7a582a7c4..708c3bc7c 100644 --- a/webapp/components/FilterMenu/FilterMenuComponent.vue +++ b/webapp/components/FilterMenu/FilterMenuComponent.vue @@ -3,6 +3,7 @@

{{ $t('filter-menu.filter-by') }}

+
@@ -13,6 +14,7 @@ diff --git a/webapp/locales/de.json b/webapp/locales/de.json index a43f871d1..82b7c7bd4 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -378,9 +378,11 @@ }, "filter-menu": { "all": "Alle", + "article": "Artikel", "categories": "Themen", "deleteFilter": "Filter löschen", "emotions": "Emotionen", + "events": "Veranstaltungen", "filter-by": "Filtern nach ...", "following": "Nutzer denen ich folge", "languages": "Sprachen", @@ -396,6 +398,7 @@ } }, "order-by": "Sortieren nach ...", + "post-type": "Beitrags-Typ", "save": { "error": "Themen konnten nicht gespeichert werden!", "success": "Themen gespeichert!" diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 252cb7978..45a241957 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -378,9 +378,11 @@ }, "filter-menu": { "all": "All", + "article": "Article", "categories": "Topics", "deleteFilter": "Delete filter", "emotions": "Emotions", + "events": "Events", "filter-by": "Filter by ...", "following": "Users I follow", "languages": "Languages", @@ -396,6 +398,7 @@ } }, "order-by": "Order by ...", + "post-type": "Post type", "save": { "error": "Failed saving topic settings!", "success": "Topics saved!" diff --git a/webapp/store/posts.js b/webapp/store/posts.js index 587867b0e..6deb2ed15 100644 --- a/webapp/store/posts.js +++ b/webapp/store/posts.js @@ -63,6 +63,12 @@ export const mutations = { if (isEmpty(get(filter, 'categories_some.id_in'))) delete filter.categories_some state.filter = filter }, + TOGGLE_POST_TYPE(state, postType) { + const filter = clone(state.filter) + update(filter, 'postType_in', (postTypes) => xor(postTypes, [postType])) + if (isEmpty(get(filter, 'postType_in'))) delete filter.postType_in + state.filter = filter + }, TOGGLE_LANGUAGE(state, languageCode) { const filter = clone(state.filter) update(filter, 'language_in', (languageCodes) => xor(languageCodes, [languageCode])) @@ -90,6 +96,9 @@ export const getters = { filteredCategoryIds(state) { return get(state.filter, 'categories_some.id_in') || [] }, + filteredPostTypes(state) { + return get(state.filter, 'postType_in') || [] + }, filteredLanguageCodes(state) { return get(state.filter, 'language_in') || [] }, diff --git a/webapp/store/posts.spec.js b/webapp/store/posts.spec.js index 665b147ae..72e35ef95 100644 --- a/webapp/store/posts.spec.js +++ b/webapp/store/posts.spec.js @@ -25,6 +25,18 @@ describe('getters', () => { }) }) + describe('filteredPostTypes', () => { + it('returns post types if filter is set', () => { + state = { filter: { postType_in: ['Article', 'Event'] } } + expect(getters.filteredPostTypes(state)).toEqual(['Article', 'Event']) + }) + + it('returns empty array if post type filter is not set', () => { + state = { filter: { author: { followedBy_some: { id: 7 } } } } + expect(getters.filteredPostTypes(state)).toEqual([]) + }) + }) + describe('filteredLanguageCodes', () => { it('returns category ids if filter is set', () => { state = { filter: { language_in: ['en', 'de', 'pt'] } } @@ -213,6 +225,46 @@ describe('mutations', () => { }) }) + describe('TOGGLE_POST_TYPE', () => { + beforeEach(() => { + testMutation = (postType) => { + mutations.TOGGLE_POST_TYPE(state, postType) + return getters.filter(state) + } + }) + + it('creates post type filter if empty', () => { + state = { filter: {} } + expect(testMutation('Event')).toEqual({ postType_in: ['Event'] }) + }) + + it('adds post type not present', () => { + state = { filter: { postType_in: ['Event'] } } + expect(testMutation('Article')).toEqual({ postType_in: ['Event', 'Article'] }) + }) + + it('removes category id if present', () => { + state = { filter: { postType_in: ['Event', 'Article'] } } + const result = testMutation('Event') + expect(result).toEqual({ postType_in: ['Article'] }) + }) + + it('removes category filter if empty', () => { + state = { filter: { postType_in: ['Event'] } } + expect(testMutation('Event')).toEqual({}) + }) + + it('does not get in the way of other filters', () => { + state = { + filter: { + author: { followedBy_some: { id: 7 } }, + postType_in: ['Event'], + }, + } + expect(testMutation('Event')).toEqual({ author: { followedBy_some: { id: 7 } } }) + }) + }) + describe('TOGGLE_FILTER_BY_FOLLOWED', () => { beforeEach(() => { testMutation = (userId) => {