diff --git a/helpers/stork/browser.js b/helpers/stork/browser.js index b8b9a44..c0b54e8 100644 --- a/helpers/stork/browser.js +++ b/helpers/stork/browser.js @@ -241,10 +241,14 @@ export class StorkFilters { } } - get filtersForQuery () { + get list () { return Object.entries( this.filters ).map( ([ filterKey, filterValue ]) => { return `${ filterKey }${ statusFilterSeparator }${ filterValue }` - } ).join(' ') + } ) + } + + get asQuery () { + return this.list.join(' ') } isQueryValue ( filterNameOrQueryValue ) { @@ -269,13 +273,32 @@ export class StorkFilters { } } - removeFilter ( filterName ) { + remove ( filterName ) { // Throw error if it's not a valid filter name if ( this.isQueryValue( filterName ) ) throw new Error(`${ filterName } is not a valid filter name`) delete this.filters[ filterName ] } + setFromString ( filterNameOrQueryValue ) { + const { + key, + value = '' + } = this.getFilterNameAndValueFromString( filterNameOrQueryValue ) + + // Throw for empty values + if ( value.trim().length === 0 ) throw new Error(`${ filterNameOrQueryValue } is not a valid filter value`) + + this.set( key, value ) + } + + set ( filterName, filterValue ) { + // Throw error if it's not a valid filter name + if ( this.isQueryValue( filterName ) ) throw new Error(`${ filterName } is not a valid filter name`) + + this.filters[ filterName ] = filterValue + } + toggleFilter ( filterNameOrQueryValue, filterValue = null ) { const fromString = this.getFilterNameAndValueFromString( filterNameOrQueryValue ) @@ -284,8 +307,8 @@ export class StorkFilters { filterValue = filterValue || fromString.value // If the filter is already set, remove it - if ( this.hasFilter( filterNameOrQueryValue ) ) { - this.removeFilter( filterName ) + if ( this.has( filterNameOrQueryValue ) ) { + this.remove( filterName ) return } @@ -295,10 +318,10 @@ export class StorkFilters { throw new Error(`Filter value must be a string. Got ${ typeof filterValue }`) } - this.filters[ filterName ] = filterValue + this.set( filterName, filterValue ) } - hasFilter ( filterNameOrQueryValue ) { + has ( filterNameOrQueryValue ) { const { key : filterName, diff --git a/test/prebuild/filters.js b/test/prebuild/filters.js index 4f7d261..becf5a6 100644 --- a/test/prebuild/filters.js +++ b/test/prebuild/filters.js @@ -17,18 +17,18 @@ test('Can Toggle off existing filter' , async t => { filters.toggleFilter('test') - t.deepEqual(filters.hasFilter('test'), false) + t.deepEqual(filters.has('test'), false) filters.toggleFilter('test', 'yes') filters.toggleFilter('status', 'native') - t.deepEqual(filters.hasFilter('test'), true, 'Has test filter') + t.deepEqual(filters.has('test'), true, 'Has test filter') - t.deepEqual(filters.filtersForQuery, 'test_yes status_native', 'Has correct filters for query') + t.deepEqual(filters.asQuery, 'test_yes status_native', 'Has correct filters for query') filters.toggleFilter('status_native') - t.deepEqual(filters.filtersForQuery, 'test_yes', 'Has only test filter') + t.deepEqual(filters.asQuery, 'test_yes', 'Has only test filter') }) @@ -39,9 +39,9 @@ test('Can handle query values with multiple underscores', async t => { } }) - t.log( 'filters.filtersForQuery', filters.filtersForQuery ) + t.log( 'filters.asQuery', filters.asQuery ) - t.assert( filters.hasFilter( 'test_value_with_multiple_underscores' ) , 'Has correct filters for query' ) + t.assert( filters.has( 'test_value_with_multiple_underscores' ) , 'Has correct filters for query' ) }) @@ -54,8 +54,14 @@ test( 'Can update existing filter', async t => { filters.toggleFilter('test_works_yes') - t.deepEqual( filters.filtersForQuery, 'test_works_yes', 'Has updated filter') + t.deepEqual( filters.asQuery, 'test_works_yes', 'Has updated filter') }) +test( 'Can set filters from string', async t => { + const filters = new StorkFilters() + filters.setFromString( 'test_works_yes' ) + + t.deepEqual( filters.asQuery, 'test_works_yes', 'Has updated filter') +})