« get me outta code hell

generateQuickDescription.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/generateQuickDescription.js
blob: c67dd1ec3970bba028b9cac2d8857b17483d6860 (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
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
export default {
  contentDependencies: ['transformContent'],
  extraDependencies: ['html', 'language'],

  query: (thing) => ({
    hasDescription:
      !!thing.description,

    hasLongerDescription:
      thing.description &&
      thing.descriptionShort &&
      thing.descriptionShort !== thing.description,
  }),

  relations: (relation, query, thing) => ({
    description:
      (query.hasLongerDescription || !thing.description
        ? null
        : relation('transformContent', thing.description)),

    descriptionShort:
      (query.hasLongerDescription
        ? relation('transformContent', thing.descriptionShort)
        : null),

    descriptionLong:
      (query.hasLongerDescription
        ? relation('transformContent', thing.description)
        : null),
  }),

  data: (query) => ({
    hasDescription: query.hasDescription,
    hasLongerDescription: query.hasLongerDescription,
  }),

  slots: {
    extraReadingLinks: {validate: v => v.sparseArrayOf(v.isHTML)},
  },

  generate(data, relations, slots, {html, language}) {
    const prefix = 'misc.quickDescription';

    const actionsWithoutLongerDescription =
      (data.hasLongerDescription
        ? null
     : slots.extraReadingLinks
        ? language.$(prefix, 'readMore', {
            links:
              language.formatDisjunctionList(slots.extraReadingLinks),
          })
        : null);

    const wrapExpandCollapseLink = (expandCollapse, content) =>
      html.tag('a',
        {href: '#', class: `${expandCollapse}-link`},
        content);

    const actionsWhenCollapsed =
      (!data.hasLongerDescription
        ? null
     : slots.extraReadingLinks
        ? language.$(prefix, 'expandDescription.orReadMore', {
            links:
              language.formatDisjunctionList(slots.extraReadingLinks),
            expand:
              wrapExpandCollapseLink('expand',
                language.$(prefix, 'expandDescription.orReadMore.expand')),
          })
        : language.$(prefix, 'expandDescription', {
            expand:
              wrapExpandCollapseLink('expand',
                language.$(prefix, 'expandDescription.expand')),
          }));

    const actionsWhenExpanded =
      (!data.hasLongerDescription
        ? null
      : slots.extraReadingLinks
        ? language.$(prefix, 'collapseDescription.orReadMore', {
            links:
              language.formatDisjunctionList(slots.extraReadingLinks),
            collapse:
              wrapExpandCollapseLink('collapse',
                language.$(prefix, 'collapseDescription.orReadMore.collapse')),
          })
        : language.$(prefix, 'collapseDescription', {
            collapse:
              wrapExpandCollapseLink('collapse',
                language.$(prefix, 'collapseDescription.collapse')),
          }));

    const wrapActions = (classes, children) =>
      html.tag('p',
        {[html.onlyIfContent]: true, class: [
          'quick-description-actions',
          ...classes]},
        children);

    const wrapContent = (classes, content) =>
      html.tag('div',
        {[html.onlyIfContent]: true, class: classes},
        content?.slot('mode', 'multiline'));

    return (
      html.tag('div', {
        [html.onlyIfContent]: true,
        class: [
          'quick-description',

          data.hasLongerDescription &&
            'collapsed',

          !data.hasLongerDescription &&
          !slots.extraReadingLinks &&
            'has-content-only',

          !data.hasDescription &&
          slots.extraReadingLinks &&
            'has-external-links-only',
        ],
      }, [
        wrapContent(['description-content'], relations.description),
        wrapContent(['description-content', 'short'], relations.descriptionShort),
        wrapContent(['description-content', 'long'], relations.descriptionLong),

        wrapActions([], actionsWithoutLongerDescription),
        wrapActions(['when-collapsed'], actionsWhenCollapsed),
        wrapActions(['when-expanded'], actionsWhenExpanded),
      ]));
  }
};