aboutsummaryrefslogtreecommitdiffhomepage
path: root/assets/vintage/js/base.js
blob: 55f1c37dfb6811e181c07287619c8f4633bd27a3 (plain) (blame)
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
import Awesomplete from 'awesomplete';
import 'awesomplete/awesomplete.css';

(() => {
  const autocompleteFields = document.querySelectorAll('input[data-multiple]');
  const tagsSeparatorElement = document.querySelector('input[name="tags_separator"]');
  const tagsSeparator = tagsSeparatorElement ? tagsSeparatorElement.value || ' ' : ' ';

  [...autocompleteFields].forEach((autocompleteField) => {
    const awesome = new Awesomplete(Awesomplete.$(autocompleteField));

    // Tags are separated by separator
    awesome.filter = (text, input) => Awesomplete.FILTER_CONTAINS(
      text,
      input.match(new RegExp(`[^${tagsSeparator}]*$`))[0],
    );
    // Insert new selected tag in the input
    awesome.replace = (text) => {
      const before = awesome.input.value.match(new RegExp(`^.+${tagsSeparator}+|`))[0];
      awesome.input.value = `${before}${text}${tagsSeparator}`;
    };
    // Highlight found items
    awesome.item = (text, input) => Awesomplete.ITEM(text, input.match(new RegExp(`[^${tagsSeparator}]*$`))[0]);

    // Don't display already selected items
    // WARNING: pseudo classes does not seem to work with string litterals...
    const reg = new RegExp(`([^${tagsSeparator}]+)${tagsSeparator}`, 'g');
    let match;
    awesome.data = (item, input) => {
      while ((match = reg.exec(input))) {
        if (item === match[1]) {
          return '';
        }
      }
      return item;
    };
    awesome.minChars = 1;
  });
})();