« get me outta code hell

generateContributionLinks.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/generateContributionLinks.js
blob: 18bc409d66dfc760f456ddd9372cbe39b872ac31 (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
import {empty} from '../../util/sugar.js';

export default {
  contentDependencies: [
    'linkArtist',
    'generateIconForURL',
  ],

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

  relations(relation, contributions, {showIcons = false} = {}) {
    const relations = {};

    relations.artistLinks =
      contributions.map(({who}) => relation('linkArtist', who));

    if (showIcons) {
      relations.artistIcons =
        contributions.map(({who}) =>
          who.urls.map(url =>
            relation('generateIconForURL', url)));
    }

    return relations;
  },

  data(contributions, {
    showContribution = false,
    showIcons = false,
  } = {}) {
    const data = {};

    data.contributionData =
      contributions.map(({who, what}) => ({
        hasContributionPart: !!(showContribution && what),
        hasExternalPart: !!(showIcons && !empty(who.urls)),
        contribution: showContribution && what,
      }));

    return data;
  },

  generate(data, relations, {
    html,
    language,
  }) {
    return language.formatConjunctionList(
      data.contributionData.map(({
        hasContributionPart,
        hasExternalPart,
        contribution,
      }, index) => {
        const artistLink = relations.artistLinks[index];
        const artistIcons = relations.artistIcons?.[index];

        const externalLinks = hasExternalPart &&
          html.tag('span',
            {[html.noEdgeWhitespace]: true, class: 'icons'},
            language.formatUnitList(artistIcons));

        return (
          (hasContributionPart
            ? (hasExternalPart
                ? language.$('misc.artistLink.withContribution.withExternalLinks', {
                    artist: artistLink,
                    contrib: contribution,
                    links: externalLinks,
                  })
                : language.$('misc.artistLink.withContribution', {
                    artist: artistLink,
                    contrib: contribution,
                  }))
            : (hasExternalPart
                ? language.$('misc.artistLink.withExternalLinks', {
                    artist: artistLink,
                    links: externalLinks,
                  })
                : language.$('misc.artistLink', {
                    artist: artistLink,
                  })))
        );
      }));
  },
};