« 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: 4c7c944aed2d5b8a364a16936e70771573d316ed (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
133
134
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', {class: `${expandCollapse}-link`},
        {href: '#'},
        content);

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

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

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

        children);

    const wrapContent = (attributes, content) =>
      html.tag('div', {class: 'description-content'},
        {[html.onlyIfContent]: true},
        attributes,

        content?.slot('mode', 'multiline'));

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

        data.hasLongerDescription &&
          {class: 'collapsed'},

        !data.hasLongerDescription &&
        !slots.extraReadingLinks &&
          {class: 'has-content-only'},

        !data.hasDescription &&
        slots.extraReadingLinks &&
          {class: 'has-external-links-only'},

        [
          wrapContent(null, relations.description),
          wrapContent({class: 'short'}, relations.descriptionShort),
          wrapContent({class: 'long'}, relations.descriptionLong),

          wrapActions(null, actionsWithoutLongerDescription),
          wrapActions({class: 'when-collapsed'}, actionsWhenCollapsed),
          wrapActions({class: 'when-expanded'}, actionsWhenExpanded),
        ]));
  },
};