summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/listbox/index.js
blob: f63171e2785f56c99f59d1211628ef9e46e4ae1d (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
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
import Vue from 'vue';
import { parseBoolean } from '~/lib/utils/common_utils';

export function parseAttributes(el) {
  const { items: itemsString, selected, right: rightString } = el.dataset;

  const items = JSON.parse(itemsString);
  const right = parseBoolean(rightString);

  const { className } = el;

  return { items, selected, right, className };
}

export function initListbox(el, { onChange } = {}) {
  if (!el) return null;

  const { items, selected, right, className } = parseAttributes(el);

  return new Vue({
    el,
    data() {
      return {
        selected,
      };
    },
    computed: {
      text() {
        return items.find(({ value }) => value === this.selected)?.text;
      },
    },
    render(h) {
      return h(
        GlDropdown,
        {
          props: {
            text: this.text,
            right,
          },
          class: className,
        },
        items.map((item) =>
          h(
            GlDropdownItem,
            {
              props: {
                isCheckItem: true,
                isChecked: this.selected === item.value,
              },
              on: {
                click: () => {
                  this.selected = item.value;

                  if (typeof onChange === 'function') {
                    onChange(item);
                  }
                },
              },
            },
            item.text,
          ),
        ),
      );
    },
  });
}