« 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: f86dead7f1f3c355625928cf6bc88d45fc53c952 (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
75
import {sortChronologically} from '#sort';
import {stitchArrays} from '#sugar';

export default {
  contentDependencies: [
    'generateColorStyleAttribute',
    'generateTooltip',
    'linkOtherReleaseOnArtistInfoPage',
  ],

  extraDependencies: ['html', 'language'],

  query: (track) => ({
    rereleases:
      sortChronologically(track.allReleases).slice(1),
  }),

  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.dateFirstReleased ??
      track.album.date,

    rereleaseDates:
      query.rereleases
        .map(rerelease =>
          rerelease.dateFirstReleased ??
          rerelease.album.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,
                }),
              ])),
      })),
};