Skip to content
This repository was archived by the owner on Sep 9, 2024. It is now read-only.

Commit 2c72215

Browse files
authored
fix: properly handle default group and filter (#1083)
1 parent ccd242c commit 2c72215

File tree

11 files changed

+174
-157
lines changed

11 files changed

+174
-157
lines changed

packages/core/src/actions/config.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ function applyFolderCollectionDefaults(
145145
): FolderCollectionWithDefaults {
146146
const collection: FolderCollectionWithDefaults = {
147147
...originalCollection,
148+
view_filters: undefined,
149+
view_groups: undefined,
148150
i18n: collectionI18n,
149151
};
150152

@@ -228,6 +230,8 @@ function applyFilesCollectionDefaults(
228230
const collection: FilesCollectionWithDefaults = {
229231
...originalCollection,
230232
i18n: collectionI18n,
233+
view_filters: undefined,
234+
view_groups: undefined,
231235
files: originalCollection.files.map(f =>
232236
applyCollectionFileDefaults(f, originalCollection, collectionI18n, config),
233237
),
@@ -271,7 +275,7 @@ function applyCollectionDefaults(
271275
collection.fields = setI18nDefaultsForFields(collection.fields, Boolean(collectionI18n));
272276
}
273277

274-
const { view_filters, view_groups } = collection;
278+
const { view_filters, view_groups } = originalCollection;
275279

276280
if (!collection.sortable_fields) {
277281
collection.sortable_fields = {
@@ -280,7 +284,7 @@ function applyCollectionDefaults(
280284
}
281285

282286
collection.view_filters = {
283-
default: collection.view_filters?.default,
287+
default: originalCollection.view_filters?.default,
284288
filters: (view_filters?.filters ?? []).map(filter => {
285289
return {
286290
...filter,
@@ -290,7 +294,7 @@ function applyCollectionDefaults(
290294
};
291295

292296
collection.view_groups = {
293-
default: collection.view_groups?.default,
297+
default: originalCollection.view_groups?.default,
294298
groups: (view_groups?.groups ?? []).map(group => {
295299
return {
296300
...group,

packages/core/src/actions/entries.ts

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,7 @@ import { Cursor } from '../lib/util';
4444
import { getFields, updateFieldByKey } from '../lib/util/collection.util';
4545
import { createEmptyDraftData, createEmptyDraftI18nData } from '../lib/util/entry.util';
4646
import { selectCollectionEntriesCursor } from '../reducers/selectors/cursors';
47-
import {
48-
selectEntriesSelectedSort,
49-
selectIsFetching,
50-
selectPublishedSlugs,
51-
} from '../reducers/selectors/entries';
47+
import { selectIsFetching, selectPublishedSlugs } from '../reducers/selectors/entries';
5248
import { addSnackbar } from '../store/slices/snackbars';
5349
import { createAssetProxy } from '../valueObjects/AssetProxy';
5450
import createEntry from '../valueObjects/createEntry';
@@ -73,7 +69,9 @@ import type {
7369
SortDirection,
7470
ValueOrNestedValue,
7571
ViewFilter,
72+
ViewFilterWithDefaults,
7673
ViewGroup,
74+
ViewGroupWithDefaults,
7775
} from '../interface';
7876
import type { RootState } from '../store';
7977
import type AssetProxy from '../valueObjects/AssetProxy';
@@ -122,7 +120,10 @@ export function entriesLoading(collection: CollectionWithDefaults) {
122120
} as const;
123121
}
124122

125-
export function filterEntriesRequest(collection: CollectionWithDefaults, filter: ViewFilter) {
123+
export function filterEntriesRequest(
124+
collection: CollectionWithDefaults,
125+
filter: ViewFilterWithDefaults,
126+
) {
126127
return {
127128
type: FILTER_ENTRIES_REQUEST,
128129
payload: {
@@ -162,7 +163,10 @@ export function filterEntriesFailure(
162163
} as const;
163164
}
164165

165-
export function groupEntriesRequest(collection: CollectionWithDefaults, group: ViewGroup) {
166+
export function groupEntriesRequest(
167+
collection: CollectionWithDefaults,
168+
group: ViewGroupWithDefaults,
169+
) {
166170
return {
167171
type: GROUP_ENTRIES_REQUEST,
168172
payload: {
@@ -315,7 +319,7 @@ export function sortByField(
315319
};
316320
}
317321

318-
export function filterByField(collection: CollectionWithDefaults, filter: ViewFilter) {
322+
export function filterByField(collection: CollectionWithDefaults, filter: ViewFilterWithDefaults) {
319323
return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState) => {
320324
const state = getState();
321325
// if we're already fetching we update the filter key, but skip loading entries
@@ -334,17 +338,12 @@ export function filterByField(collection: CollectionWithDefaults, filter: ViewFi
334338
};
335339
}
336340

337-
export function groupByField(collection: CollectionWithDefaults, group: ViewGroup) {
341+
export function groupByField(collection: CollectionWithDefaults, group: ViewGroupWithDefaults) {
338342
return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState) => {
339343
const state = getState();
340344
const isFetching = selectIsFetching(state, collection.name);
341-
dispatch({
342-
type: GROUP_ENTRIES_REQUEST,
343-
payload: {
344-
collection: collection.name,
345-
group,
346-
},
347-
});
345+
dispatch(groupEntriesRequest(collection, group));
346+
348347
if (isFetching) {
349348
return;
350349
}
@@ -699,10 +698,6 @@ export function loadEntries(collection: CollectionWithDefaults, page = 0) {
699698
return;
700699
}
701700
const state = getState();
702-
const sortField = selectEntriesSelectedSort(state, collection.name);
703-
if (sortField) {
704-
return dispatch(sortByField(collection, sortField.key, sortField.direction));
705-
}
706701

707702
const configState = state.config;
708703
if (!configState.config) {
@@ -751,6 +746,7 @@ export function loadEntries(collection: CollectionWithDefaults, page = 0) {
751746
);
752747
} catch (error: unknown) {
753748
console.error(error);
749+
754750
if (error instanceof Error) {
755751
dispatch(
756752
addSnackbar({

packages/core/src/components/collections/CollectionControls.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ import GroupControl from './GroupControl';
77
import MobileCollectionControls from './mobile/MobileCollectionControls';
88
import SortControl from './SortControl';
99

10-
import type { ViewStyle } from '@staticcms/core/constants/views';
1110
import type {
1211
FilterMap,
1312
GroupMap,
1413
SortableField,
1514
SortDirection,
1615
SortMap,
17-
ViewFilter,
18-
ViewGroup,
16+
ViewFilterWithDefaults,
17+
ViewGroupWithDefaults,
1918
} from '@staticcms/core';
19+
import type { ViewStyle } from '@staticcms/core/constants/views';
2020
import type { FC } from 'react';
2121

2222
interface CollectionControlsProps {
@@ -26,11 +26,11 @@ interface CollectionControlsProps {
2626
onSortClick?: (key: string, direction?: SortDirection) => Promise<void>;
2727
sort?: SortMap | undefined;
2828
filter?: Record<string, FilterMap>;
29-
viewFilters?: ViewFilter[];
30-
onFilterClick?: (filter: ViewFilter) => void;
29+
viewFilters?: ViewFilterWithDefaults[];
30+
onFilterClick?: (filter: ViewFilterWithDefaults) => void;
3131
group?: Record<string, GroupMap>;
32-
viewGroups?: ViewGroup[];
33-
onGroupClick?: (filter: ViewGroup) => void;
32+
viewGroups?: ViewGroupWithDefaults[];
33+
onGroupClick?: (filter: ViewGroupWithDefaults) => void;
3434
}
3535

3636
const CollectionControls: FC<CollectionControlsProps> = ({

packages/core/src/components/collections/CollectionView.tsx

Lines changed: 10 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import React, { useCallback, useEffect, useMemo, useState } from 'react';
1+
import React, { useCallback, useMemo } from 'react';
22

33
import {
44
changeViewStyle,
55
filterByField,
66
groupByField,
77
sortByField,
88
} from '@staticcms/core/actions/entries';
9-
import { SORT_DIRECTION_ASCENDING } from '@staticcms/core/constants';
109
import useTranslate from '@staticcms/core/lib/hooks/useTranslate';
1110
import {
1211
getSortableFields,
@@ -28,8 +27,13 @@ import CollectionHeader from './CollectionHeader';
2827
import EntriesCollection from './entries/EntriesCollection';
2928
import EntriesSearch from './entries/EntriesSearch';
3029

30+
import type {
31+
CollectionWithDefaults,
32+
SortDirection,
33+
ViewFilterWithDefaults,
34+
ViewGroupWithDefaults,
35+
} from '@staticcms/core';
3136
import type { ViewStyle } from '@staticcms/core/constants/views';
32-
import type { CollectionWithDefaults, SortDirection, ViewFilter, ViewGroup } from '@staticcms/core';
3337
import type { FC } from 'react';
3438

3539
import './Collection.css';
@@ -70,13 +74,6 @@ const CollectionView: FC<CollectionViewProps> = ({
7074
const filter = useAppSelector(state => selectEntriesFilter(state, collection?.name));
7175
const group = useAppSelector(state => selectEntriesGroup(state, collection?.name));
7276

73-
const [readyToLoad, setReadyToLoad] = useState(false);
74-
const [prevCollection, setPrevCollection] = useState<CollectionWithDefaults | null>();
75-
76-
useEffect(() => {
77-
setPrevCollection(collection);
78-
}, [collection]);
79-
8077
const searchResultKey = useMemo(
8178
() => `collection.collectionTop.searchResults${isSingleSearchResult ? 'InCollection' : ''}`,
8279
[isSingleSearchResult],
@@ -110,21 +107,14 @@ const CollectionView: FC<CollectionViewProps> = ({
110107
}
111108

112109
return (
113-
<EntriesCollection
114-
collection={collection}
115-
viewStyle={viewStyle}
116-
filterTerm={filterTerm}
117-
readyToLoad={readyToLoad && collection === prevCollection}
118-
/>
110+
<EntriesCollection collection={collection} viewStyle={viewStyle} filterTerm={filterTerm} />
119111
);
120112
}, [
121113
collection,
122114
collections,
123115
filterTerm,
124116
isSearchResults,
125117
isSingleSearchResult,
126-
prevCollection,
127-
readyToLoad,
128118
searchTerm,
129119
viewStyle,
130120
]);
@@ -137,14 +127,14 @@ const CollectionView: FC<CollectionViewProps> = ({
137127
);
138128

139129
const onFilterClick = useCallback(
140-
async (filter: ViewFilter) => {
130+
async (filter: ViewFilterWithDefaults) => {
141131
collection && (await dispatch(filterByField(collection, filter)));
142132
},
143133
[collection, dispatch],
144134
);
145135

146136
const onGroupClick = useCallback(
147-
async (group: ViewGroup) => {
137+
async (group: ViewGroupWithDefaults) => {
148138
collection && (await dispatch(groupByField(collection, group)));
149139
},
150140
[collection, dispatch],
@@ -157,80 +147,6 @@ const CollectionView: FC<CollectionViewProps> = ({
157147
[dispatch],
158148
);
159149

160-
useEffect(() => {
161-
if (prevCollection === collection) {
162-
if (!readyToLoad) {
163-
setReadyToLoad(true);
164-
}
165-
return;
166-
}
167-
168-
if (sort?.[0]?.key) {
169-
if (!readyToLoad) {
170-
setReadyToLoad(true);
171-
}
172-
return;
173-
}
174-
175-
const defaultSort = collection?.sortable_fields?.default;
176-
const defaultViewGroupName = collection?.view_groups?.default;
177-
const defaultViewFilterName = collection?.view_filters?.default;
178-
if (!defaultViewGroupName && !defaultViewFilterName && (!defaultSort || !defaultSort.field)) {
179-
if (!readyToLoad) {
180-
setReadyToLoad(true);
181-
}
182-
return;
183-
}
184-
185-
setReadyToLoad(false);
186-
187-
let alive = true;
188-
189-
const sortGroupFilterEntries = () => {
190-
setTimeout(async () => {
191-
if (defaultSort && defaultSort.field) {
192-
await onSortClick(defaultSort.field, defaultSort.direction ?? SORT_DIRECTION_ASCENDING);
193-
}
194-
195-
if (defaultViewGroupName) {
196-
const defaultViewGroup = viewGroups?.groups.find(g => g.name === defaultViewGroupName);
197-
if (defaultViewGroup) {
198-
await onGroupClick(defaultViewGroup);
199-
}
200-
}
201-
202-
if (defaultViewFilterName) {
203-
const defaultViewFilter = viewFilters?.filters.find(
204-
f => f.name === defaultViewFilterName,
205-
);
206-
if (defaultViewFilter) {
207-
await onFilterClick(defaultViewFilter);
208-
}
209-
}
210-
211-
if (alive) {
212-
setReadyToLoad(true);
213-
}
214-
});
215-
};
216-
217-
sortGroupFilterEntries();
218-
219-
return () => {
220-
alive = false;
221-
};
222-
}, [
223-
collection,
224-
onFilterClick,
225-
onGroupClick,
226-
onSortClick,
227-
prevCollection,
228-
readyToLoad,
229-
sort,
230-
viewFilters?.filters,
231-
viewGroups?.groups,
232-
]);
233-
234150
const collectionDescription = collection?.description;
235151

236152
return (

packages/core/src/components/collections/FilterControl.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import Menu from '../common/menu/Menu';
77
import MenuGroup from '../common/menu/MenuGroup';
88
import MenuItemButton from '../common/menu/MenuItemButton';
99

10-
import type { FilterMap, ViewFilter } from '@staticcms/core';
11-
import type { MouseEvent, FC } from 'react';
10+
import type { FilterMap, ViewFilterWithDefaults } from '@staticcms/core';
11+
import type { FC, MouseEvent } from 'react';
1212

1313
import './FilterControl.css';
1414

@@ -24,9 +24,9 @@ export const classes = generateClassNames('FilterControl', [
2424

2525
export interface FilterControlProps {
2626
filter: Record<string, FilterMap> | undefined;
27-
viewFilters: ViewFilter[] | undefined;
27+
viewFilters: ViewFilterWithDefaults[] | undefined;
2828
variant?: 'menu' | 'list';
29-
onFilterClick: ((viewFilter: ViewFilter) => void) | undefined;
29+
onFilterClick: ((viewFilter: ViewFilterWithDefaults) => void) | undefined;
3030
}
3131

3232
const FilterControl: FC<FilterControlProps> = ({
@@ -40,7 +40,7 @@ const FilterControl: FC<FilterControlProps> = ({
4040
const anyActive = useMemo(() => Object.keys(filter).some(key => filter[key]?.active), [filter]);
4141

4242
const handleFilterClick = useCallback(
43-
(viewFilter: ViewFilter) => (event: MouseEvent) => {
43+
(viewFilter: ViewFilterWithDefaults) => (event: MouseEvent) => {
4444
event.stopPropagation();
4545
event.preventDefault();
4646
onFilterClick?.(viewFilter);

0 commit comments

Comments
 (0)