Skip to content

Commit c3dd2e7

Browse files
feat(ProjectFeedListToolbar): allow user to and/or filter labels
1 parent f8995e9 commit c3dd2e7

File tree

6 files changed

+62
-18
lines changed

6 files changed

+62
-18
lines changed

lib/manager/actions/visibilityFilter.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ export const setVisibilityLabel = createAction(
1010
'SET_PROJECT_VISIBILITY_LABEL',
1111
(payload: Array<any>) => payload
1212
)
13+
export const setVisibilityLabelMode = createAction(
14+
'SET_PROJECT_VISIBILITY_LABEL_MODE',
15+
(payload: string) => payload
16+
)
1317
export const setVisibilityFilter = createAction(
1418
'SET_PROJECT_VISIBILITY_FILTER',
1519
(payload: any) => payload

lib/manager/components/ProjectFeedListToolbar.js

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
/* eslint-disable jsx-a11y/no-onchange */
2+
// Deprecated rule (https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-onchange.md)
3+
14
// @flow
25

36
import Icon from '@conveyal/woonerf/components/icon'
@@ -52,6 +55,7 @@ type Props = ContainerProps & {
5255
setFeedSourceTableFilterCountStrategy: typeof projectsActions.setFeedSourceTableFilterCountStrategy,
5356
setVisibilityFilter: typeof visibilityFilterActions.setVisibilityFilter,
5457
setVisibilityLabel: typeof visibilityFilterActions.setVisibilityLabel,
58+
setVisibilityLabelMode: typeof visibilityFilterActions.setVisibilityLabelMode,
5559
setVisibilitySearchText: typeof visibilityFilterActions.setVisibilitySearchText,
5660
sort: FeedSourceTableSortStrategiesWithOrders,
5761
thirdPartySync: typeof projectsActions.thirdPartySync,
@@ -290,30 +294,49 @@ export default class ProjectFeedListToolbar extends PureComponent<Props> {
290294
}
291295

292296
_renderLabelFilter = () => {
293-
const { project, setVisibilityLabel } = this.props
297+
const { project, setVisibilityLabel, setVisibilityLabelMode, filter } = this.props
294298
// This variable must be set directly from this.props both
295299
// to allow the override and for flow
296300
const labels = this.props.filter.labels || []
301+
const {labelsFilterMode} = filter
297302

298303
function handleClick (labelId: string) {
299304
const index = labels.indexOf(labelId)
300305
index >= 0 ? labels.splice(index, 1) : labels.push(labelId)
301306
setVisibilityLabel(labels)
302307
}
303-
return <MenuItem header style={{minWidth: 275}}>
304-
<h5>Select labels to filter by</h5>
305-
<div className='feedLabelContainer'>
306-
{project.labels.map((label) => (
307-
<FeedLabel
308-
key={label.id}
309-
label={label}
310-
checked={labels.includes(label.id)}
311-
small
312-
onClick={() => handleClick(label.id)}
313-
/>
314-
))}
315-
</div>
316-
</MenuItem>
308+
function handleSelectLabelMode (e) {
309+
const { value: newMode } = e.target
310+
setVisibilityLabelMode(newMode)
311+
}
312+
return (
313+
<MenuItem header style={{ minWidth: 275 }}>
314+
<h5>
315+
Show{' '}
316+
<select
317+
name='anyonly'
318+
id='anyonly'
319+
value={labelsFilterMode}
320+
onChange={handleSelectLabelMode}
321+
>
322+
<option value='any'>any</option>
323+
<option value='only'>only</option>
324+
</select>{' '}
325+
feeds with the labels
326+
</h5>
327+
<div className='feedLabelContainer'>
328+
{project.labels.map((label) => (
329+
<FeedLabel
330+
key={label.id}
331+
label={label}
332+
checked={labels.includes(label.id)}
333+
small
334+
onClick={() => handleClick(label.id)}
335+
/>
336+
))}
337+
</div>
338+
</MenuItem>
339+
)
317340
}
318341

319342
_renderFilterToolbarLabel = () => {
@@ -348,6 +371,10 @@ export default class ProjectFeedListToolbar extends PureComponent<Props> {
348371
)
349372
}
350373

374+
componentDidMount = () => {
375+
this.props.setVisibilityLabelMode('any')
376+
}
377+
351378
render () {
352379
const {
353380
filter,

lib/manager/containers/ProjectFeedListToolbar.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import {
1313
import {
1414
setVisibilityFilter,
1515
setVisibilitySearchText,
16-
setVisibilityLabel
16+
setVisibilityLabel,
17+
setVisibilityLabelMode
1718
} from '../actions/visibilityFilter'
1819
import {deploymentsEnabledAndAccessAllowedForProject} from '../../common/util/permissions'
1920
import ProjectFeedListToolbar from '../components/ProjectFeedListToolbar'
@@ -72,6 +73,7 @@ const mapDispatchToProps = {
7273
setVisibilityFilter,
7374
setVisibilitySearchText,
7475
setVisibilityLabel,
76+
setVisibilityLabelMode,
7577
thirdPartySync
7678
}
7779

lib/manager/reducers/projects.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ const projects = (state: ProjectsState = defaultState, action: Action): Projects
3838
return update(state, {filter: {searchText: {$set: action.payload}}})
3939
case 'SET_PROJECT_VISIBILITY_LABEL':
4040
return update(state, {filter: {labels: {$set: action.payload}}})
41+
case 'SET_PROJECT_VISIBILITY_LABEL_MODE':
42+
return update(state, {filter: {labelsFilterMode: {$set: action.payload}}})
4143
case 'SET_PROJECT_VISIBILITY_FILTER':
4244
return update(state, {filter: {filter: {$set: action.payload}}})
4345
case 'CREATE_DEPLOYMENT':

lib/manager/util/index.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,14 +204,22 @@ export function getFilteredFeeds (
204204
// If no label is specified, return all
205205
if (!labels || labels.length === 0) return feedSource
206206

207-
return labels.find(labelToCheck => {
207+
function labelVerify (labelToCheck) {
208208
return feedSource.labels
209209
// first map to strings
210210
.map(label => label.id)
211211
// If any label is matched, we include it regardless
212212
// of what happens next
213213
.includes(labelToCheck)
214-
})
214+
}
215+
216+
if (filter.labelsFilterMode === 'any') {
217+
return labels.find(labelVerify)
218+
}
219+
220+
if (filter.labelsFilterMode === 'only') {
221+
return labels.every(labelVerify)
222+
}
215223
})
216224
.sort(feedSortOptions[sort])
217225
}

lib/types/reducers.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ export type ProjectFilter = {
512512
feedSourceTableFilterCountStrategy: FeedSourceTableFilterCountStrategies,
513513
filter: any,
514514
labels?: Array<string>,
515+
labelsFilterMode: string,
515516
searchText: null | string
516517
}
517518

0 commit comments

Comments
 (0)