« get me outta code hell

generateArtistInfoPageFirstReleaseTooltip.js « dependencies « content « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateArtistInfoPageFirstReleaseTooltip.js
blob: d588edc0cff022c999de7c82aec0af3a13e4ee0b (plain)
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
import {sortAlbumsTracksChronologically} from '#sort';
import {stitchArrays} from '#sugar';

export default {
query: (track, artist) => ({
  rereleases:
    sortAlbumsTracksChronologically(
      track.otherReleases
        .filter(track => track.album.style !== 'meta')
        .filter(track => {
          const contribs = [
            ...track.artistContribs,
            ...track.contributorContribs,
          ];

          return contribs.some(contrib => contrib.artist === artist);
        })),
}),

  relations: (relation, query, track, artist) => ({
    tooltip:
      relation('generateTooltip'),

    firstReleaseColorStyle:
      relation('generateColorStyleAttribute', track.color),

    rereleaseLinks:
      query.rereleases
        .map(rerelease =>
          relation('linkOtherReleaseOnArtistInfoPage', rerelease, artist)),
  }),

  data: (query, track) => ({
    firstReleaseDate:
      track.date,

    rereleaseDates:
      query.rereleases
        .map(rerelease => rerelease.date),
  }),

  generate: (data, relations, {html, language}) =>
    language.encapsulate('artistPage.creditList.entry.firstRelease', capsule =>
      relations.tooltip.slots({
        attributes: [
          {class: 'first-release-tooltip'},
          relations.firstReleaseColorStyle,
        ],

        contentAttributes: [
          {[html.joinChildren]: html.tag('hr', {class: 'cute'})},
        ],

        content:
          stitchArrays({
            rereleaseLink: relations.rereleaseLinks,
            rereleaseDate: data.rereleaseDates,
          }).map(({rereleaseLink, rereleaseDate}) =>
              html.tags([
                language.$(capsule, 'rerelease', {
                  album:
                    html.metatag('blockwrap', rereleaseLink),
                }),

                html.tag('br'),

                language.formatRelativeDate(rereleaseDate, data.firstReleaseDate, {
                  considerRoundingDays: true,
                  approximate: true,
                  absolute: true,
                }),
              ])),
      })),
};