1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
import {empty, stitchArrays, unique} from '#sugar';
import {
filterMultipleArrays,
getArtistNumContributions,
sortAlphabetically,
} from '#wiki-data';
export default {
contentDependencies: ['generateListingPage', 'linkArtist', 'linkGroup'],
extraDependencies: ['language', 'wikiData'],
sprawl({artistData, wikiInfo}) {
return {artistData, wikiInfo};
},
query(sprawl, spec) {
const artists = sortAlphabetically(sprawl.artistData.slice());
const groups = sprawl.wikiInfo.divideTrackListsByGroups;
if (empty(groups)) {
return {spec, artists};
}
const artistGroups =
artists.map(artist =>
unique(
unique([
...artist.albumsAsAny,
...artist.tracksAsAny.map(track => track.album),
]).flatMap(album => album.groups)))
const artistsByGroup =
groups.map(group =>
artists.filter((artist, index) => artistGroups[index].includes(group)));
filterMultipleArrays(groups, artistsByGroup,
(group, artists) => !empty(artists));
return {spec, groups, artistsByGroup};
},
relations(relation, query) {
const relations = {};
relations.page =
relation('generateListingPage', query.spec);
if (query.artists) {
relations.artistLinks =
query.artists
.map(artist => relation('linkArtist', artist));
}
if (query.artistsByGroup) {
relations.groupLinks =
query.groups
.map(group => relation('linkGroup', group));
relations.artistLinksByGroup =
query.artistsByGroup
.map(artists => artists
.map(artist => relation('linkArtist', artist)));
}
return relations;
},
data(query) {
const data = {};
if (query.artists) {
data.counts =
query.artists
.map(artist => getArtistNumContributions(artist));
}
if (query.artistsByGroup) {
data.groupDirectories =
query.groups
.map(group => group.directory);
data.countsByGroup =
query.artistsByGroup
.map(artists => artists
.map(artist => getArtistNumContributions(artist)));
}
return data;
},
generate(data, relations, {language}) {
return (
(relations.artistLinksByGroup
? relations.page.slots({
type: 'chunks',
showSkipToSection: true,
chunkIDs:
data.groupDirectories
.map(directory => `contributed-to-${directory}`),
chunkTitles:
relations.groupLinks.map(groupLink => ({
group: groupLink,
})),
chunkRows:
stitchArrays({
artistLinks: relations.artistLinksByGroup,
counts: data.countsByGroup,
}).map(({artistLinks, counts}) =>
stitchArrays({
link: artistLinks,
count: counts,
}).map(({link, count}) => ({
artist: link,
contributions: language.countContributions(count, {unit: true}),
}))),
})
: relations.page.slots({
type: 'rows',
rows:
stitchArrays({
link: relations.artistLinks,
count: data.counts,
}).map(({link, count}) => ({
artist: link,
contributions: language.countContributions(count, {unit: true}),
})),
})));
},
};
|