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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  | 
import {stitchArrays, unique} from '#sugar';
import {getKebabCase} from '#wiki-data';
export default {
  query(album) {
    const query = {};
    const trackArtworkLabels =
      album.tracks
        .map(track => track.trackArtworks
          .map(artwork => artwork.label));
    const recurranceThreshold = 2;
    // This list may include null, if some artworks are not labelled!
    // That's expected.
    query.recurringTrackArtworkLabels =
      unique(trackArtworkLabels.flat())
        .filter(label =>
          trackArtworkLabels
            .filter(labels => labels.includes(label))
            .length >=
          (label === null
            ? 1
            : recurranceThreshold));
    return query;
  },
  relations: (relation, query, album) => ({
    layout:
      relation('generatePageLayout'),
    albumStyleTags:
      relation('generateAlbumStyleTags', album, null),
    albumLink:
      relation('linkAlbum', album),
    albumNavAccent:
      relation('generateAlbumNavAccent', album, null),
    secondaryNav:
      relation('generateAlbumSecondaryNav', album),
    statsLine:
      relation('generateAlbumGalleryStatsLine', album),
    noTrackArtworksLine:
      (album.tracks.every(track => !track.hasUniqueCoverArt)
        ? relation('generateAlbumGalleryNoTrackArtworksLine')
        : null),
    setSwitcher:
      relation('generateIntrapageDotSwitcher'),
    albumGrid:
      relation('generateAlbumGalleryAlbumGrid', album),
    trackGrids:
      query.recurringTrackArtworkLabels.map(label =>
        relation('generateAlbumGalleryTrackGrid', album, label)),
  }),
  data: (query, album) => ({
    trackGridLabels:
      query.recurringTrackArtworkLabels,
    trackGridIDs:
      query.recurringTrackArtworkLabels.map(label =>
        'track-grid-' +
          (label
            ? getKebabCase(label)
            : 'no-label')),
    name:
      album.name,
    color:
      album.color,
  }),
  generate: (data, relations, {html, language}) =>
    language.encapsulate('albumGalleryPage', pageCapsule =>
      relations.layout.slots({
        title:
          language.$(pageCapsule, 'title', {
            album: data.name,
          }),
        headingMode: 'static',
        color: data.color,
        styleTags: relations.albumStyleTags,
        mainClasses: ['top-index'],
        mainContent: [
          relations.statsLine,
          relations.albumGrid,
          relations.noTrackArtworksLine,
          data.trackGridLabels.some(value => value !== null) &&
            html.tag('p', {class: 'gallery-set-switcher'},
              language.encapsulate(pageCapsule, 'setSwitcher', switcherCapsule =>
                language.$(switcherCapsule, {
                  sets:
                    relations.setSwitcher.slots({
                      initialOptionIndex: 0,
                      titles:
                        data.trackGridLabels.map(label =>
                          label ??
                          language.$(switcherCapsule, 'unlabeledSet')),
                      targetIDs:
                        data.trackGridIDs,
                    }),
                }))),
          stitchArrays({
            grid: relations.trackGrids,
            id: data.trackGridIDs,
          }).map(({grid, id}, index) =>
              grid.slots({
                attributes: [
                  {id},
                  index >= 1 && {style: 'display: none'},
                ],
              })),
        ],
        navLinkStyle: 'hierarchical',
        navLinks: [
          {auto: 'home'},
          {
            html:
              relations.albumLink
                .slot('attributes', {class: 'current'}),
            accent:
              relations.albumNavAccent.slots({
                showTrackNavigation: false,
                showExtraLinks: true,
                currentExtra: 'gallery',
              }),
          },
        ],
        secondaryNav: relations.secondaryNav,
      })),
};
  |