Skip to content

Commit c9d65ee

Browse files
committed
Extract operator registry
1 parent d37ac85 commit c9d65ee

File tree

5 files changed

+430
-241
lines changed

5 files changed

+430
-241
lines changed

packages/dataviews/src/components/dataviews-filters/filter.tsx

Lines changed: 10 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
Icon,
1818
} from '@wordpress/components';
1919
import { __, sprintf } from '@wordpress/i18n';
20-
import { useRef, createInterpolateElement } from '@wordpress/element';
20+
import { useRef } from '@wordpress/element';
2121
import { closeSmall } from '@wordpress/icons';
2222
import { dateI18n, getDate } from '@wordpress/date';
2323

@@ -26,12 +26,7 @@ import { dateI18n, getDate } from '@wordpress/date';
2626
*/
2727
import SearchWidget from './search-widget';
2828
import InputWidget from './input-widget';
29-
import {
30-
OPERATORS,
31-
MULTI_SELECTION_OPERATOR_NAMES,
32-
SINGLE_SELECTION_OPERATOR_NAMES,
33-
CUSTOM_SELECTION_OPERATOR_NAMES,
34-
} from '../../constants';
29+
import { getOperatorByName } from '../../utils/operators';
3530
import type {
3631
Filter,
3732
NormalizedField,
@@ -78,49 +73,9 @@ const FilterText = ( {
7873
return filter.name;
7974
}
8075

81-
const filterTextWrappers = {
82-
Name: <span className="dataviews-filters__summary-filter-text-name" />,
83-
Value: (
84-
<span className="dataviews-filters__summary-filter-text-value" />
85-
),
86-
};
87-
88-
const operator = OPERATORS.find(
89-
( op ) => op.name === filterInView?.operator
90-
);
91-
if (
92-
operator !== undefined &&
93-
MULTI_SELECTION_OPERATOR_NAMES.includes( operator.name )
94-
) {
95-
return createInterpolateElement(
96-
sprintf(
97-
/* translators: 1: Filter name. 2: Operator name. 3: Filter value. e.g.: "Author is any: Admin, Editor". */
98-
__( '<Name>%1$s %2$s: </Name><Value>%3$s</Value>' ),
99-
filter.name,
100-
operator.display ?? operator.label.toLowerCase(),
101-
activeElements.map( ( element ) => element.label ).join( ', ' )
102-
),
103-
filterTextWrappers
104-
);
105-
}
106-
107-
if (
108-
operator !== undefined &&
109-
[
110-
...SINGLE_SELECTION_OPERATOR_NAMES,
111-
...CUSTOM_SELECTION_OPERATOR_NAMES,
112-
].includes( operator.name )
113-
) {
114-
return createInterpolateElement(
115-
sprintf(
116-
/* translators: 1: Filter name. 2: Operator name. 3: Filter value. e.g.: "Author starts with: Adm". */
117-
__( '<Name>%1$s %2$s: </Name><Value>%3$s</Value>' ),
118-
filter.name,
119-
operator.display ?? operator.label.toLowerCase(),
120-
activeElements[ 0 ].label
121-
),
122-
filterTextWrappers
123-
);
76+
const operator = getOperatorByName( filterInView?.operator );
77+
if ( operator !== undefined ) {
78+
return operator.filterText( filter, activeElements );
12479
}
12580

12681
return sprintf(
@@ -137,8 +92,7 @@ function OperatorSelector( {
13792
}: OperatorSelectorProps ) {
13893
const operatorOptions = filter.operators?.map( ( operator ) => ( {
13994
value: operator,
140-
label:
141-
OPERATORS.find( ( op ) => op.name === operator )?.label || operator,
95+
label: getOperatorByName( operator )?.label || operator,
14296
} ) );
14397
const currentFilter = view.filters?.find(
14498
( _filter ) => _filter.field === filter.field
@@ -171,16 +125,12 @@ function OperatorSelector( {
171125
_filter.field === filter.field
172126
) {
173127
const currentOpSelectionModel =
174-
OPERATORS.find(
175-
( op ) =>
176-
op.name ===
177-
currentOperator
128+
getOperatorByName(
129+
currentOperator
178130
)?.selection;
179131
const newOpSelectionModel =
180-
OPERATORS.find(
181-
( op ) =>
182-
op.name ===
183-
newOperator
132+
getOperatorByName(
133+
newOperator
184134
)?.selection;
185135

186136
const shouldResetValue =

packages/dataviews/src/components/dataviews-filters/use-filters.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { useMemo } from '@wordpress/element';
77
* Internal dependencies
88
*/
99
import {
10-
ALL_OPERATOR_NAMES,
11-
SINGLE_SELECTION_OPERATOR_NAMES,
12-
} from '../../constants';
10+
isRegisteredOperator,
11+
isSingleSelectionOperator,
12+
} from '../../utils/operators';
1313
import type { NormalizedFilter, NormalizedField, View } from '../../types';
1414

1515
function useFilters( fields: NormalizedField< any >[], view: View ) {
@@ -36,7 +36,7 @@ function useFilters( fields: NormalizedField< any >[], view: View ) {
3636
getElements: field.getElements,
3737
hasElements: field.hasElements,
3838
singleSelection: operators.some( ( op ) =>
39-
SINGLE_SELECTION_OPERATOR_NAMES.includes( op )
39+
isSingleSelectionOperator( op )
4040
),
4141
operators,
4242
isVisible:
@@ -45,7 +45,7 @@ function useFilters( fields: NormalizedField< any >[], view: View ) {
4545
!! view.filters?.some(
4646
( f ) =>
4747
f.field === field.id &&
48-
ALL_OPERATOR_NAMES.includes( f.operator )
48+
isRegisteredOperator( f.operator )
4949
),
5050
isPrimary,
5151
isLocked,

packages/dataviews/src/constants.ts

Lines changed: 1 addition & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { arrowDown, arrowUp } from '@wordpress/icons';
77
/**
88
* Internal dependencies
99
*/
10-
import type { Operator, DayNumber } from './types';
10+
import type { DayNumber } from './types';
1111

1212
// Filter operators.
1313
export const OPERATOR_IS_ANY = 'isAny';
@@ -33,179 +33,6 @@ export const OPERATOR_STARTS_WITH = 'startsWith';
3333
export const OPERATOR_ON = 'on';
3434
export const OPERATOR_NOT_ON = 'notOn';
3535

36-
export const OPERATORS: {
37-
name: Operator;
38-
label: string;
39-
display?: string;
40-
selection: 'single' | 'multi' | 'custom';
41-
}[] = [
42-
{
43-
name: OPERATOR_IS_ANY,
44-
/* translators: DataViews operator name */
45-
label: __( 'Includes' ),
46-
selection: 'multi',
47-
},
48-
{
49-
name: OPERATOR_IS_NONE,
50-
/* translators: DataViews operator name */
51-
label: __( 'Is none of' ),
52-
selection: 'multi',
53-
},
54-
{
55-
name: OPERATOR_IS_ALL,
56-
/* translators: DataViews operator name */
57-
label: __( 'Includes all' ),
58-
selection: 'multi',
59-
},
60-
{
61-
name: OPERATOR_IS_NOT_ALL,
62-
/* translators: DataViews operator name */
63-
label: __( 'Is none of' ),
64-
selection: 'multi',
65-
},
66-
{
67-
name: OPERATOR_BETWEEN,
68-
/* translators: DataViews operator name */
69-
label: __( 'Between (inc)' ),
70-
selection: 'custom',
71-
},
72-
{
73-
name: OPERATOR_IN_THE_PAST,
74-
/* translators: DataViews operator name */
75-
label: __( 'In the past' ),
76-
/* translators: DataViews operator string, e.g.: "Date is in the past: 2 days" */
77-
display: __( 'is in the past' ),
78-
selection: 'custom',
79-
},
80-
{
81-
name: OPERATOR_OVER,
82-
/* translators: DataViews operator name */
83-
label: __( 'Over' ),
84-
/* translators: DataViews operator string, e.g.: "Date is over: 2 days" */
85-
display: __( 'is over' ),
86-
selection: 'custom',
87-
},
88-
{
89-
name: OPERATOR_IS,
90-
/* translators: DataViews operator name */
91-
label: __( 'Is' ),
92-
selection: 'single',
93-
},
94-
{
95-
name: OPERATOR_IS_NOT,
96-
/* translators: DataViews operator name */
97-
label: __( 'Is not' ),
98-
selection: 'single',
99-
},
100-
{
101-
name: OPERATOR_LESS_THAN,
102-
/* translators: DataViews operator name */
103-
label: __( 'Less than' ),
104-
selection: 'single',
105-
},
106-
{
107-
name: OPERATOR_GREATER_THAN,
108-
/* translators: DataViews operator name */
109-
label: __( 'Greater than' ),
110-
/* translators: DataViews operator string, e.g.: "Count is greater than: 2" */
111-
display: __( 'is greater than' ),
112-
selection: 'single',
113-
},
114-
{
115-
name: OPERATOR_LESS_THAN_OR_EQUAL,
116-
/* translators: DataViews operator name */
117-
label: __( 'Less than or equal' ),
118-
/* translators: DataViews operator string, e.g.: "Count is less than or equal to: 2" */
119-
display: __( 'is less than or equal to' ),
120-
selection: 'single',
121-
},
122-
{
123-
name: OPERATOR_GREATER_THAN_OR_EQUAL,
124-
/* translators: DataViews operator name */
125-
label: __( 'Greater than or equal' ),
126-
/* translators: DataViews operator string, e.g.: "Count is greater than or equal to: 2" */
127-
display: __( 'is greater than or equal to' ),
128-
selection: 'single',
129-
},
130-
{
131-
name: OPERATOR_BEFORE,
132-
/* translators: DataViews operator name */
133-
label: __( 'Before' ),
134-
/* translators: DataViews operator string, e.g.: "Date is after: 2025-02-01" */
135-
display: __( 'is before' ),
136-
selection: 'single',
137-
},
138-
{
139-
name: OPERATOR_AFTER,
140-
/* translators: DataViews operator name */
141-
label: __( 'After' ),
142-
/* translators: DataViews operator string, e.g.: "Date is after: 2025-02-01" */
143-
display: __( 'is after' ),
144-
selection: 'single',
145-
},
146-
{
147-
name: OPERATOR_BEFORE_INC,
148-
/* translators: DataViews operator name */
149-
label: __( 'Before (inc)' ),
150-
/* translators: DataViews operator string, e.g.: "Date is on or before: 2025-02-01" */
151-
display: __( 'is on or before' ),
152-
selection: 'single',
153-
},
154-
{
155-
name: OPERATOR_AFTER_INC,
156-
/* translators: DataViews operator name */
157-
label: __( 'After (inc)' ),
158-
/* translators: DataViews operator string, e.g.: "Date is on or after: 2025-02-01" */
159-
display: __( 'is on or after' ),
160-
selection: 'single',
161-
},
162-
{
163-
name: OPERATOR_CONTAINS,
164-
/* translators: DataViews operator name */
165-
label: __( 'Contains' ),
166-
selection: 'single',
167-
},
168-
{
169-
name: OPERATOR_NOT_CONTAINS,
170-
/* translators: DataViews operator name */
171-
label: __( "Doesn't contain" ),
172-
selection: 'single',
173-
},
174-
{
175-
name: OPERATOR_STARTS_WITH,
176-
/* translators: DataViews operator name */
177-
label: __( 'Starts with' ),
178-
selection: 'single',
179-
},
180-
{
181-
name: OPERATOR_ON,
182-
/* translators: DataViews operator name */
183-
label: __( 'On' ),
184-
/* translators: DataViews operator string, e.g.: "Author is: Admin" */
185-
display: __( 'is' ),
186-
selection: 'single',
187-
},
188-
{
189-
name: OPERATOR_NOT_ON,
190-
/* translators: DataViews operator name */
191-
label: __( 'Not on' ),
192-
/* translators: DataViews operator string, e.g.: "Author is not: Admin" */
193-
display: __( 'is not' ),
194-
selection: 'single',
195-
},
196-
];
197-
198-
export const ALL_OPERATOR_NAMES = OPERATORS.map( ( op ) => op.name );
199-
export const SINGLE_SELECTION_OPERATOR_NAMES = OPERATORS.filter(
200-
( op ) => op.selection === 'single'
201-
).map( ( op ) => op.name );
202-
export const MULTI_SELECTION_OPERATOR_NAMES = OPERATORS.filter(
203-
( op ) => op.selection === 'multi'
204-
).map( ( op ) => op.name );
205-
export const CUSTOM_SELECTION_OPERATOR_NAMES = OPERATORS.filter(
206-
( op ) => op.selection === 'custom'
207-
).map( ( op ) => op.name );
208-
20936
export const SORTING_DIRECTIONS = [ 'asc', 'desc' ] as const;
21037
export const sortArrows = { asc: '↑', desc: '↓' };
21138
export const sortValues = { asc: 'ascending', desc: 'descending' } as const;

packages/dataviews/src/field-types/no-type.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
*/
44
import type { SortDirection } from '../types';
55
import type { FieldType } from '../types/private';
6-
import { ALL_OPERATOR_NAMES, OPERATOR_IS, OPERATOR_IS_NOT } from '../constants';
6+
import { OPERATOR_IS, OPERATOR_IS_NOT } from '../constants';
7+
import { getAllOperatorNames } from '../utils/operators';
78
import render from './utils/render-default';
89
import sortText from './utils/sort-text';
910
import sortNumber from './utils/sort-number';
@@ -26,7 +27,7 @@ export default {
2627
enableSorting: true,
2728
enableGlobalSearch: false,
2829
defaultOperators: [ OPERATOR_IS, OPERATOR_IS_NOT ],
29-
validOperators: ALL_OPERATOR_NAMES,
30+
validOperators: getAllOperatorNames(),
3031
getFormat: () => ( {} ),
3132
validate: {
3233
required: isValidRequired,

0 commit comments

Comments
 (0)