« 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: f555af287ee882c60d07d3d6707d5c6ef5f1a1ff (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
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,
  }),

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

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

    const actionsWhenCollapsed =
      (data.hasLongerDescription
        ? language.$(prefix, 'expandDescription', {
            expand:
              wrapExpandCollapseLink('expand',
                language.$(prefix, 'expandDescription.expand')),
          })
        : null);

    const actionsWhenExpanded =
      (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'},

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

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