Skip to content

Commit fd217bd

Browse files
authored
recursively hoist regions that duplicate their parent (#463)
* recursively hoist single-child nodes * refactor and test
1 parent 0a2df5f commit fd217bd

File tree

5 files changed

+93
-2
lines changed

5 files changed

+93
-2
lines changed

public/app.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/helpers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ export * from './get-index-by-key';
1616
export * from './load-meeting-data';
1717
export * from './query-string';
1818
export * from './settings';
19+
export * from './streamline-regions-index';
1920
export * from './translate-google-sheet';
2021
export * from './user-agent';

src/helpers/load-meeting-data.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { formatAddress } from './format-address';
55
import { formatConferenceProvider } from './format-conference-provider';
66
import { formatSlug } from './format-slug';
77
import { states } from './states';
8+
import { streamlineRegionsIndex } from './streamline-regions-index';
89

910
import type { Index, JSONData, JSONDataFlat, Meeting, State } from '../types';
1011

@@ -517,6 +518,8 @@ export function loadMeetingData(
517518

518519
// determine capabilities (filter out options that apply to every meeting)
519520
const meetingsCount = Object.keys(meetings).length;
521+
indexes.region = streamlineRegionsIndex(indexes.region, meetingsCount);
522+
520523
['region', 'weekday', 'time', 'type'].forEach(indexKey => {
521524
capabilities[indexKey as keyof typeof capabilities] = !!indexes[
522525
indexKey as keyof typeof indexes
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { Index } from '../types';
2+
3+
// clean up nodes that apply to all the parent's children
4+
export const streamlineRegionsIndex = (
5+
indexes: Index[],
6+
meetingsCount: number
7+
): Index[] =>
8+
indexes
9+
.filter(index => index.children || index.slugs.length < meetingsCount)
10+
.flatMap(index => {
11+
if (index.slugs.length === meetingsCount) {
12+
// recursively process children, flattening the result
13+
return streamlineRegionsIndex(index.children ?? [], index.slugs.length);
14+
}
15+
// return a new object with streamlined children if present
16+
return {
17+
...index,
18+
children: index.children
19+
? streamlineRegionsIndex(index.children, index.slugs.length)
20+
: undefined,
21+
};
22+
});
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { streamlineRegionsIndex } from '../../src/helpers';
2+
import type { Index } from '../../src/types';
3+
4+
describe('streamlineRegionsIndex', () => {
5+
it('removes top level regions that apply to all meetings', () => {
6+
const mockIndexes: Index[] = [
7+
{
8+
key: 'usa',
9+
name: 'United States',
10+
slugs: ['meeting-1', 'meeting-2', 'meeting-3'],
11+
children: [
12+
{
13+
key: 'california',
14+
name: 'California',
15+
slugs: ['meeting-1', 'meeting-2', 'meeting-3'],
16+
children: [
17+
{
18+
key: 'los-angeles',
19+
name: 'Los Angeles',
20+
slugs: ['meeting-1', 'meeting-2'],
21+
},
22+
{
23+
key: 'san-francisco',
24+
name: 'San Francisco',
25+
slugs: ['meeting-3'],
26+
},
27+
],
28+
},
29+
],
30+
},
31+
];
32+
33+
expect(streamlineRegionsIndex(mockIndexes, 3)).toEqual([
34+
{
35+
key: 'los-angeles',
36+
name: 'Los Angeles',
37+
slugs: ['meeting-1', 'meeting-2'],
38+
},
39+
{
40+
key: 'san-francisco',
41+
name: 'San Francisco',
42+
slugs: ['meeting-3'],
43+
},
44+
]);
45+
});
46+
47+
it("removes bottom regions that apply to all parent's meetings", () => {
48+
const mockIndexes: Index[] = [
49+
{
50+
key: 'usa',
51+
name: 'United States',
52+
slugs: ['meeting-1', 'meeting-2', 'meeting-3'],
53+
children: [
54+
{
55+
key: 'california',
56+
name: 'California',
57+
slugs: ['meeting-1', 'meeting-2', 'meeting-3'],
58+
},
59+
],
60+
},
61+
];
62+
63+
expect(streamlineRegionsIndex(mockIndexes, 3)).toEqual([]);
64+
});
65+
});

0 commit comments

Comments
 (0)