aboutsummaryrefslogtreecommitdiff
path: root/resources/assets/javascripts/bootstrap/lists.js
blob: ac7b85c2dad8ebc5a71cbd81087bc027c530bded (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
import {$gettext} from "@/assets/javascripts/lib/gettext";

(() => {
    let uniqueId = 0;

    STUDIP.ready(() => {
        document.querySelectorAll('.collapsible-list').forEach(list => {
            if (!list.matches('ol,ul')) {
                console.error('Not applicable for anything else than ol/ul lists');
            }

            const data = list.dataset;

            if (data.collapsibleListInitialized !== undefined) {
                return;
            }

            data.collapsibleListInitialized = true;

            const label = data.label ?? $gettext('Einträge');
            const max = Number.parseInt(data.collapseAfter ?? 5, 10);
            const items = Array.from(list.children);
            const hiddenItems = items.slice(max);
            const hiddenCount = hiddenItems.length;

            if (hiddenCount === 0) {
                return;
            }

            const id = list.getAttribute('id') ?? `collapsable-list-${uniqueId++}`;
            list.setAttribute('id', id);

            const button = Object.assign(document.createElement('button'), {
                className: 'as-link',
                textContent: '',
                type: 'button',
            });
            button.setAttribute('aria-controls', id);

            const update = (collapsed) => {
                button.textContent = collapsed
                    ? $gettext('%{count} weitere %{label} anzeigen', {count: hiddenCount, label})
                    : $gettext('weniger %{label} anzeigen', {label});
                button.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
                hiddenItems.forEach(li => li.toggleAttribute('hidden', collapsed));
            };

            update(true);

            button.addEventListener('click', () => {
                update(button.getAttribute('aria-expanded') === 'true');
            });

            list.after(button);
        });
    });
})();