Skip to content

Commit

Permalink
[SDPA-2949] Fix: Search results query to support filter object. (#528)
Browse files Browse the repository at this point in the history
* [SDPA-2949] Fix: Search results query to support filter object.
* setFiltersOnCreate() did not support the current URL structure.

* [SDPA-2949] Add search test for setFiltersOnCreate changes.
  • Loading branch information
alan-cole authored and tim-yao committed Oct 10, 2019
1 parent b3c4d53 commit edeb5ec
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 15 deletions.
57 changes: 42 additions & 15 deletions packages/ripple-nuxt-tide/modules/search/lib/search/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -237,23 +237,50 @@ export default (config, router, site) => ({
searchForm.prefillSearchTerm = query.q || ''
// Populate the filters.
if (query.filters) {
for (let filter in query.filters) {
if (typeof searchForm.filterForm.model[filter] !== 'undefined') {
if (typeof query.filters[filter] === 'string') {
if (!searchForm.filterForm.model[filter].includes(query.filters[filter])) {
if (Array.isArray(searchForm.filterForm.model[filter])) {
searchForm.filterForm.model[filter].push(query.filters[filter])
} else {
searchForm.filterForm.model[filter] = query.filters[filter]
for (const filterName in query.filters) {
const formFilter = searchForm.filterForm.model[filterName]

if (typeof formFilter !== 'undefined') {
const queryFilter = query.filters[filterName]
const queryFilterType = Array.isArray(queryFilter) ? 'array' : typeof queryFilter

switch (queryFilterType) {
case 'string':
if (!formFilter.includes(queryFilter)) {
if (Array.isArray(formFilter)) {
formFilter.push(queryFilter)
} else {
searchForm.filterForm.model[filterName] = queryFilter
}
}
}
}
if (Array.isArray(query.filters[filter])) {
for (let index in query.filters[filter]) {
if (!searchForm.filterForm.model[filter].includes(query.filters[filter][index])) {
searchForm.filterForm.model[filter].push(query.filters[filter][index])
break
case 'array':
for (const queryFilterItem of queryFilter) {
if (!formFilter.includes(queryFilterItem)) {
formFilter.push(queryFilterItem)
}
}
}
break
case 'object':
if (Array.isArray(formFilter)) {
if (Array.isArray(queryFilter.values)) {
queryFilter.values.forEach(item => {
if (!formFilter.includes(item)) {
formFilter.push(item)
}
})
} else {
if (!formFilter.includes(queryFilter.values)) {
formFilter.push(queryFilter.values)
}
}
} else {
searchForm.filterForm.model[filterName] = queryFilter.values
}
break
default:
console.warn('An unknown query filter was encountered.')
break
}
}
}
Expand Down
54 changes: 54 additions & 0 deletions packages/ripple-nuxt-tide/test/unit/search.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import tideSearch from '../../modules/search/lib/search/module.js'

describe('search filters', () => {
test('should set filters from various input types', async () => {
// Based on this query...
const mockRouter = {
currentRoute: {
query: {
q: 'test',
filters: {
field_filter_string_to_string: 'Set Filter A',
field_filter_string_to_array: 'Set Filter A',
field_filter_array_to_array: [ 'Set Filter A', 'Set Filter B' ],
field_filter_object_string_to_string: { 'values': 'Set Filter A' },
field_filter_object_string_to_array: { 'values': 'Set Filter A' },
field_filter_object_array_to_array: { 'values': [ 'Set Filter A', 'Set Filter B' ] }
}
}
}
}
// ...this form model...
const mockFormData = {
filterForm: {
model: {
field_filter_string_to_string: '',
field_filter_string_to_array: [],
field_filter_array_to_array: [],
field_filter_object_string_to_string: '',
field_filter_object_string_to_array: [],
field_filter_object_array_to_array: []
}
}
}
// ...will set these filters.
const expectedFormChanges = {
filterForm: {
model: {
field_filter_string_to_string: 'Set Filter A',
field_filter_string_to_array: [ 'Set Filter A' ],
field_filter_array_to_array: [ 'Set Filter A', 'Set Filter B' ],
field_filter_object_string_to_string: 'Set Filter A',
field_filter_object_string_to_array: ['Set Filter A'],
field_filter_object_array_to_array: [ 'Set Filter A', 'Set Filter B' ]
}
},
prefillSearchTerm: 'test'
}
// Set form model data based on query.
const search = tideSearch({}, mockRouter, {})
search.setFiltersOnCreate(mockFormData)
// Test filter changes.
expect(mockFormData).toEqual(expectedFormChanges)
})
})

0 comments on commit edeb5ec

Please sign in to comment.