Skip to content

Commit 0343b45

Browse files
author
Sebastian Benjamin
committed
Fix FilterForm bugs, rename filters, add defaultOperator
1 parent 9adf47b commit 0343b45

File tree

4 files changed

+75
-61
lines changed

4 files changed

+75
-61
lines changed

jbrowse/src/client/JBrowse/VariantSearch/components/FilterForm.tsx

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -104,31 +104,37 @@ const FilterForm = (props: FilterFormProps ) => {
104104
}
105105
};
106106

107-
const handleFilterChange = (index, key, value) => {
108-
const newFilters = filters.map((filter, i) => {
109-
if (i === index) {
110-
const updatedFilter = Object.assign(new Filter('', OperatorKey.None, ''), { ...filter, [key]: value });
111-
112-
if (key === "operator") {
113-
updatedFilter.operator = OperatorRegistry[value as OperatorKey];
114-
115-
if (value === OperatorKey.IsEmpty || value === OperatorKey.IsNotEmpty) {
116-
updatedFilter.value = '';
117-
}
118-
119-
if (value === OperatorKey.EqualsOneOf || updatedFilter.operator.key === OperatorKey.EqualsOneOf) {
120-
updatedFilter.value = '';
121-
}
122-
}
107+
const handleFilterChange = (
108+
index: number,
109+
key: 'field' | 'operator' | 'value',
110+
value: any
111+
) => {
112+
const newFilters = filters.map((filter, i) => {
113+
if (i !== index) return filter;
114+
115+
const updatedFilter = Object.assign(
116+
new Filter('', OperatorKey.None, ''),
117+
{ ...filter, [key]: value }
118+
);
119+
120+
if (key === 'field') {
121+
const fieldInfo = fieldTypeInfo.find(f => f.name === value);
122+
const defaultOp = fieldInfo?.getDefaultOperator() ?? OperatorRegistry[OperatorKey.None];
123+
updatedFilter.operator = defaultOp;
124+
updatedFilter.value = '';
125+
}
126+
else if (key === 'operator') {
127+
updatedFilter.operator = OperatorRegistry[value as OperatorKey];
128+
updatedFilter.value = '';
129+
}
123130

124-
return updatedFilter;
125-
}
126-
return filter;
127-
});
131+
return updatedFilter;
132+
});
128133

129-
localSetFilters(newFilters);
134+
localSetFilters(newFilters);
130135
};
131136

137+
132138
const handleSubmit = (event) => {
133139
event.preventDefault()
134140
const highlighted: Record<number, { field: boolean; operator: boolean; value: boolean }> = {}
@@ -302,6 +308,7 @@ const FilterForm = (props: FilterFormProps ) => {
302308
) : fieldTypeInfo.find(obj => obj.name === filter.field)?.allowableValues?.length > 1 ? (
303309
<FormControlMinWidth sx={ highlightedInputs[index]?.value ? highlightedSx : null } >
304310
<AsyncSelect
311+
key={`async-${index}-${filter.operator.key}`}
305312
id={`value-select-${index}`}
306313
inputId={`value-select-${index}`}
307314
aria-labelledby={`value-select-${index}`}
@@ -328,7 +335,11 @@ const FilterForm = (props: FilterFormProps ) => {
328335
const val = arr.map(s => s.value).join(',')
329336
handleFilterChange(index, 'value', val)
330337
}}
331-
value={filter.value ? (filter.value as string).split(',').map(value => ({label: value, value})) : undefined}
338+
value={
339+
filter.value
340+
? (filter.value as string).split(',').map(v => ({ label: v, value: v }))
341+
: null
342+
}
332343
/>
333344
</FormControlMinWidth>
334345
) : fieldTypeInfo.find(obj => obj.name === filter.field)?.allowableValues?.length > 0 ? (

jbrowse/src/client/JBrowse/VariantSearch/components/VariantTableWidget.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ const VariantTableWidget = observer(props => {
560560
onClick={() => setFilterModalOpen(true)}
561561
style={{ border: "1px solid gray", margin: "5px" }}
562562
>
563-
{`${(filter as any).field} ${(filter as any).operator}`}
563+
{`${(filter as any).field} ${(filter as any).operator.key}`}
564564
</Button>
565565
);
566566
}
@@ -578,7 +578,7 @@ const VariantTableWidget = observer(props => {
578578
key={index}
579579
onClick={() => setFilterModalOpen(true)}
580580
style={{ border: "1px solid gray", margin: "5px" }} >
581-
{`${(filter as any).field} ${(filter as any).operator} ${(filter as any).value}`}
581+
{`${(filter as any).field} ${(filter as any).operator.key} ${(filter as any).value}`}
582582
</Button>
583583
);
584584
})}

jbrowse/src/client/JBrowse/VariantSearch/operators.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ export enum OperatorKey {
1313
NumericGte = '>=',
1414
NumericLt = '<',
1515
NumericLte = '<=',
16-
VariableIn = 'variable in',
17-
NotVariableIn = 'not variable in',
18-
VariableInAll = 'variable in all of',
19-
VariableInAny = 'variable in any of',
20-
NotVariableInAny = 'not variable in any of',
21-
NotVariableInOne = 'not variable in one of',
16+
IsIn = 'is in',
17+
IsNotIn = 'is not in',
18+
IsInAllOf = 'is in all of',
19+
IsInAnyOf = 'is in any of',
20+
IsNotInAnyOf = 'is not in any of',
21+
IsNotInOneOf = 'is not in one of',
2222
EqualsOneOf = 'equals one of',
2323
None = ''
2424
}
@@ -120,37 +120,37 @@ export const OperatorRegistry: Record<OperatorKey, Operator> = {
120120
label: 'Equals One Of',
121121
generateLucene: (f, v: string) => `${f}:~${v}~`,
122122
},
123-
[OperatorKey.VariableIn]: {
124-
key: OperatorKey.VariableIn,
125-
label: 'Variable In',
123+
[OperatorKey.IsIn]: {
124+
key: OperatorKey.IsIn,
125+
label: 'Is In',
126126
generateLucene: (f, v: string) => `${f}:${v}`,
127127
},
128-
[OperatorKey.NotVariableIn]: {
129-
key: OperatorKey.NotVariableIn,
130-
label: 'Not Variable In',
128+
[OperatorKey.IsNotIn]: {
129+
key: OperatorKey.IsNotIn,
130+
label: 'Is Not In',
131131
generateLucene: (f, v: string) => `*:* -${f}:${v}`,
132132
},
133-
[OperatorKey.VariableInAll]: {
134-
key: OperatorKey.VariableInAll,
135-
label: 'Variable In All Of',
133+
[OperatorKey.IsInAllOf]: {
134+
key: OperatorKey.IsInAllOf,
135+
label: 'Is In All Of',
136136
generateLucene: (f, v: string) =>
137137
v.split(',').map(val => `+${f}:${val}`).join(' '),
138138
},
139-
[OperatorKey.VariableInAny]: {
140-
key: OperatorKey.VariableInAny,
141-
label: 'Variable In Any Of',
139+
[OperatorKey.IsInAnyOf]: {
140+
key: OperatorKey.IsInAnyOf,
141+
label: 'Is In Any Of',
142142
generateLucene: (f, v: string) =>
143143
v.split(',').map(val => `${f}:${val}`).join(' OR '),
144144
},
145-
[OperatorKey.NotVariableInAny]: {
146-
key: OperatorKey.NotVariableInAny,
147-
label: 'Not Variable In Any Of',
145+
[OperatorKey.IsNotInAnyOf]: {
146+
key: OperatorKey.IsNotInAnyOf,
147+
label: 'Is Not In Any Of',
148148
generateLucene: (f, v: string) =>
149149
v.split(',').map(val => `*:* -${f}:${val}`).join(' AND '),
150150
},
151-
[OperatorKey.NotVariableInOne]: {
152-
key: OperatorKey.NotVariableInOne,
153-
label: 'Not Variable In One Of',
151+
[OperatorKey.IsNotInOneOf]: {
152+
key: OperatorKey.IsNotInOneOf,
153+
label: 'Is Not In One Of',
154154
generateLucene: (f, v: string) =>
155155
v.split(',').map(val => `*:* -${f}:${val}`).join(' OR '),
156156
},

jbrowse/src/client/JBrowse/utils.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ export class FieldModel {
393393
url: string
394394
flex: number
395395
supportsFilter: boolean = true
396+
defaultOperator: string
396397

397398
getLabel(): string {
398399
return this.label ?? this.name
@@ -421,12 +422,12 @@ export class FieldModel {
421422
if (this.name === 'variableSamples') {
422423
return [
423424
OperatorKey.EqualsOneOf,
424-
OperatorKey.VariableIn,
425-
OperatorKey.NotVariableIn,
426-
OperatorKey.VariableInAll,
427-
OperatorKey.VariableInAny,
428-
OperatorKey.NotVariableInAny,
429-
OperatorKey.NotVariableInOne,
425+
OperatorKey.IsIn,
426+
OperatorKey.IsNotIn,
427+
OperatorKey.IsInAllOf,
428+
OperatorKey.IsInAnyOf,
429+
OperatorKey.IsNotInAnyOf,
430+
OperatorKey.IsNotInOneOf,
430431
OperatorKey.IsEmpty,
431432
OperatorKey.IsNotEmpty,
432433
].map(k => OperatorRegistry[k])
@@ -465,6 +466,7 @@ export class FieldModel {
465466
}
466467

467468
getDefaultOperator(): Operator | undefined {
469+
if (this.defaultOperator && this.defaultOperator != "") return OperatorRegistry[this.defaultOperator]
468470
return this.getOperators()[0]
469471
}
470472

@@ -506,15 +508,16 @@ export class FieldModel {
506508
}
507509

508510
export function createEncodedFilterString(filters: Filter[]): string {
509-
if (!filters.length || filters.every(f => f.isEmpty())) return 'all'
510-
return encodeURIComponent(filters.map(f => f.encode()).join('&'))
511+
if (!filters.length || filters.every(f => f.isEmpty())) return 'all'
512+
return encodeURIComponent(filters.map(f => f.encode()).join('&'))
511513
}
512514

513515
export function buildLuceneQuery(filters: Filter[]): string {
514-
return filters
515-
.filter(f => !f.isEmpty())
516-
.map(f => f.toLucene())
517-
.join('&')
516+
if (!filters.length || filters.every(f => f.isEmpty())) return 'all'
517+
return filters
518+
.filter(f => !f.isEmpty())
519+
.map(f => f.toLucene())
520+
.join('&')
518521
}
519522

520523
export async function fetchFieldTypeInfo(sessionId: string, trackId: string, successCallback: (fields: FieldModel[], groups: string[], promotedFilters: Map<string, Filter[]>) => void, failureCallback) {
@@ -605,7 +608,7 @@ export function searchStringToInitialFilters(knownFieldNames: string[]) : Filter
605608
return Filter.fromString(searchString).filter(({ field }) => knownFieldNames.includes(field))
606609
}
607610

608-
return [new Filter('', OperatorKey.None, '')]
611+
return []
609612
}
610613

611614

0 commit comments

Comments
 (0)