« get me outta code hell

expandable-grid-section.js « client « js « static « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/static/js/client/expandable-grid-section.js
blob: ce9a4c06a69badf3472736e5e1b8f5d947df2dc1 (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
/* eslint-env browser */

import {cssProp} from '../client-util.js';

import {stitchArrays} from '../../shared-util/sugar.js';

export const info = {
  id: 'expandableGallerySectionInfo',

  items: null,
  toggles: null,
  expandCues: null,
  collapseCues: null,
};

export function getPageReferences() {
  const expandos =
    Array.from(document.querySelectorAll('.grid-expando'));

  const grids =
    expandos
      .map(expando => expando.closest('.grid-listing'));

  info.items =
    grids
      .map(grid => grid.querySelectorAll('.grid-item'))
      .map(items => Array.from(items));

  info.toggles =
    expandos
      .map(expando => expando.querySelector('.grid-expando-toggle'));

  info.expandCues =
    info.toggles
      .map(toggle => toggle.querySelector('.grid-expand-cue'));

  info.collapseCues =
    info.toggles
      .map(toggle => toggle.querySelector('.grid-collapse-cue'));
}

export function addPageListeners() {
  stitchArrays({
    items: info.items,
    toggle: info.toggles,
    expandCue: info.expandCues,
    collapseCue: info.collapseCues,
  }).forEach(({
      items,
      toggle,
      expandCue,
      collapseCue,
    }) => {
      toggle.addEventListener('click', domEvent => {
        domEvent.preventDefault();

        const collapsed =
          items.some(item =>
            item.classList.contains('hidden-by-expandable-cut'));

        for (const item of items) {
          if (
            !item.classList.contains('hidden-by-expandable-cut') &&
            !item.classList.contains('shown-by-expandable-cut')
          ) continue;

          if (collapsed) {
            item.classList.remove('hidden-by-expandable-cut');
            item.classList.add('shown-by-expandable-cut');
          } else {
            item.classList.add('hidden-by-expandable-cut');
            item.classList.remove('shown-by-expandable-cut');
          }
        }

        if (collapsed) {
          cssProp(expandCue, 'display', 'none');
          cssProp(collapseCue, 'display', null);
        } else {
          cssProp(expandCue, 'display', null);
          cssProp(collapseCue, 'display', 'none');
        }
      });
    });
}