Welcome to mirror list, hosted at ThFree Co, Russian Federation.

index.js « listbox « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 7e8fc4b637bf03382c915913f8aaf14f9ee3154e (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
import { GlCollapsibleListbox } 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(GlCollapsibleListbox, {
        props: {
          items,
          right,
          selected: this.selected,
          toggleText: this.text,
        },
        class: className,
        on: {
          select: (selectedValue) => {
            this.selected = selectedValue;
            const selectedItem = items.find(({ value }) => value === selectedValue);

            if (typeof onChange === 'function') {
              onChange(selectedItem);
            }
          },
        },
      });
    },
  });
}