Skip to content

Commit 1853da2

Browse files
committed
integrate with collection hooks changes
1 parent df0f283 commit 1853da2

File tree

3 files changed

+28
-39
lines changed

3 files changed

+28
-39
lines changed

pages/property-filter/split-panel-app-layout-integration.page.tsx

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
import React, { useState } from 'react';
3+
import React from 'react';
44
import AppLayout from '~components/app-layout';
55
import SplitPanel from '~components/split-panel';
66
import Box from '~components/box';
77
import Table from '~components/table';
8-
import PropertyFilter, { PropertyFilterProps } from '~components/property-filter';
8+
import PropertyFilter from '~components/property-filter';
99
import Header from '~components/header';
1010
import Button from '~components/button';
1111
import ScreenshotArea from '../utils/screenshot-area';
@@ -36,24 +36,21 @@ export default function () {
3636
</Box>
3737
),
3838
filteringProperties,
39-
defaultQuery: { tokens: [{ propertyKey: 'averagelatency', operator: '!=', value: '30' }], operation: 'and' },
40-
},
41-
sorting: {},
42-
});
43-
44-
// TODO: add collection-hooks support for nested queries
45-
const [query, setQuery] = useState<PropertyFilterProps.Query>({
46-
tokens: [],
47-
tokenGroups: [
48-
{
49-
operation: 'and',
50-
tokens: [
51-
{ propertyKey: 'averagelatency', operator: '>=', value: '30' },
52-
{ propertyKey: 'averagelatency', operator: '<', value: '60' },
39+
defaultQuery: {
40+
tokens: [],
41+
tokenGroups: [
42+
{
43+
operation: 'or',
44+
tokens: [
45+
{ propertyKey: 'state', operator: '=', value: '0' },
46+
{ propertyKey: 'state', operator: '=', value: '1' },
47+
],
48+
},
5349
],
50+
operation: 'or',
5451
},
55-
],
56-
operation: 'or',
52+
},
53+
sorting: {},
5754
});
5855

5956
const filteringOptions = propertyFilterProps.filteringOptions.map(option => {
@@ -100,8 +97,6 @@ export default function () {
10097
filter={
10198
<PropertyFilter
10299
{...propertyFilterProps}
103-
query={query}
104-
onChange={event => setQuery(event.detail)}
105100
filteringOptions={filteringOptions}
106101
virtualScroll={true}
107102
countText={`${items.length} matches`}

src/property-filter/controller.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,23 @@ export const getQueryActions = (
2626
inputRef: React.RefObject<AutosuggestInputRef>
2727
) => {
2828
const supportsGroups = !!query.tokenGroups;
29-
const fireOnChange = (tokenGroups: readonly TokenGroup[], operation: JoinOperation) => {
29+
const fireOnChange = (tokenGroups: readonly (Token | TokenGroup)[], operation: JoinOperation) => {
3030
if (supportsGroups) {
3131
fireNonCancelableEvent(onChange, { tokens: [], operation, tokenGroups });
3232
} else {
3333
const tokens: Token[] = [];
34-
for (const group of tokenGroups) {
35-
if ('operator' in group.tokens[0]) {
36-
tokens.push(group.tokens[0]);
34+
for (const tokenOrGroup of tokenGroups) {
35+
if ('operation' in tokenOrGroup && 'operator' in tokenOrGroup.tokens[0]) {
36+
tokens.push(tokenOrGroup.tokens[0]);
37+
} else if ('operator' in tokenOrGroup) {
38+
tokens.push(tokenOrGroup);
3739
}
3840
}
3941
fireNonCancelableEvent(onChange, { tokens, operation });
4042
}
4143
};
4244
const setToken = (index: number, newTokenGroup: TokenGroup) => {
43-
const newTokens: TokenGroup[] = query.tokenGroups
45+
const newTokens: (Token | TokenGroup)[] = query.tokenGroups
4446
? [...query.tokenGroups]
4547
: query.tokens.map(t => ({ operation: 'and', tokens: [t] }));
4648
if (newTokens && index < newTokens.length) {
@@ -49,7 +51,7 @@ export const getQueryActions = (
4951
fireOnChange(newTokens, query.operation);
5052
};
5153
const removeToken = (index: number) => {
52-
const newTokens: TokenGroup[] = query.tokenGroups
54+
const newTokens: (Token | TokenGroup)[] = query.tokenGroups
5355
? [...query.tokenGroups]
5456
: query.tokens.map(t => ({ operation: 'and', tokens: [t] }));
5557
newTokens.splice(index, 1);
@@ -61,14 +63,14 @@ export const getQueryActions = (
6163
inputRef.current?.focus({ preventDropdown: true });
6264
};
6365
const addToken = (newTokenGroup: TokenGroup) => {
64-
const newTokens: TokenGroup[] = query.tokenGroups
66+
const newTokens: (Token | TokenGroup)[] = query.tokenGroups
6567
? [...query.tokenGroups]
6668
: query.tokens.map(t => ({ operation: 'and', tokens: [t] }));
6769
newTokens.push(newTokenGroup);
6870
fireOnChange(newTokens, query.operation);
6971
};
7072
const setOperation = (newOperation: JoinOperation) => {
71-
const tokens: TokenGroup[] = query.tokenGroups
73+
const tokens: (Token | TokenGroup)[] = query.tokenGroups
7274
? [...query.tokenGroups]
7375
: query.tokens.map(t => ({ operation: 'and', tokens: [t] }));
7476
fireOnChange(tokens, newOperation);

src/property-filter/interfaces.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
PropertyFilterProperty,
2121
PropertyFilterToken,
2222
} from '@cloudscape-design/collection-hooks';
23+
import { PropertyFilterQuery, PropertyFilterTokenGroup } from '@cloudscape-design/collection-hooks/cjs/interfaces';
2324

2425
export interface PropertyFilterProps extends BaseComponentProps, ExpandToViewport, FormFieldControlProps {
2526
/**
@@ -212,6 +213,8 @@ export interface PropertyFilterProps extends BaseComponentProps, ExpandToViewpor
212213

213214
export namespace PropertyFilterProps {
214215
export type Token = PropertyFilterToken;
216+
export type TokenGroup = PropertyFilterTokenGroup;
217+
export type Query = PropertyFilterQuery;
215218
export type JoinOperation = PropertyFilterOperation;
216219
export type ComparisonOperator = PropertyFilterOperator;
217220
export type ExtendedOperator<TokenValue> = PropertyFilterOperatorExtended<TokenValue>;
@@ -222,17 +225,6 @@ export namespace PropertyFilterProps {
222225
export type FilteringProperty = PropertyFilterProperty;
223226
export type FreeTextFiltering = PropertyFilterFreeTextFiltering;
224227

225-
export interface Query {
226-
tokens: ReadonlyArray<PropertyFilterProps.Token>;
227-
operation: PropertyFilterProps.JoinOperation;
228-
tokenGroups?: ReadonlyArray<PropertyFilterProps.TokenGroup>;
229-
}
230-
231-
export interface TokenGroup {
232-
operation: PropertyFilterProps.JoinOperation;
233-
tokens: ReadonlyArray<PropertyFilterProps.TokenGroup | PropertyFilterProps.Token>;
234-
}
235-
236228
export interface LoadItemsDetail {
237229
filteringProperty?: FilteringProperty;
238230
filteringOperator?: ComparisonOperator;

0 commit comments

Comments
 (0)