« get me outta code hell

generateAlbumSecondaryNav.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/generateAlbumSecondaryNav.js
blob: 6616f20eed84f57966c1ecaa6c68a0aec4afccb5 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import {empty} from '../../util/sugar.js';

export default {
  contentDependencies: [
    'generateColorStyleVariables',
    'generateSecondaryNav',
    'linkAlbum',
    'linkGroup',
    'linkTrack',
  ],

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

  relations(relation, album) {
    const relations = {};

    relations.secondaryNav =
      relation('generateSecondaryNav');

    relations.groupParts =
      album.groups.map(group => {
        const relations = {};

        relations.groupLink =
          relation('linkGroup', group);

        relations.colorVariables =
          relation('generateColorStyleVariables', group.color);

        if (album.date) {
          const albums = group.albums.filter(album => album.date);
          const index = albums.indexOf(album);
          const previousAlbum = (index > 0) && albums[index - 1];
          const nextAlbum = (index < albums.length - 1) && albums[index + 1];

          if (previousAlbum) {
            relations.previousAlbumLink =
              relation('linkAlbum', previousAlbum);
          }

          if (nextAlbum) {
            relations.nextAlbumLink =
              relation('linkAlbum', nextAlbum);
          }
        }

        return relations;
      });

    return relations;
  },

  slots: {
    mode: {
      validate: v => v.is('album', 'track'),
      default: 'album',
    },
  },

  generate(relations, slots, {html, language}) {
    return relations.secondaryNav.slots({
      class: 'nav-links-groups',
      content:
        relations.groupParts.map(({
          colorVariables,
          groupLink,
          previousAlbumLink,
          nextAlbumLink,
        }) => {
          const links = [
            previousAlbumLink
              ?.slots({
                color: false,
                content: language.$('misc.nav.previous'),
              }),

            nextAlbumLink
              ?.slots({
                color: false,
                content: language.$('misc.nav.next'),
              }),
          ].filter(Boolean);

          return (
            (slots.mode === 'album' && !empty(links)
              ? html.tag('span', {style: colorVariables}, [
                  language.$('albumSidebar.groupBox.title', {
                    group: groupLink,
                  }),
                  `(${language.formatUnitList(links)})`,
                ])
              : language.$('albumSidebar.groupBox.title', {
                  group: groupLink,
                })));
        }),
    });
  },
};