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

user_popovers.js « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5b9e3817f3a18f1d7441ce806113c3fd0da1ff3f (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
86
87
88
89
90
91
92
93
94
import Vue from 'vue';

import UsersCache from './lib/utils/users_cache';
import UserPopover from './vue_shared/components/user_popover/user_popover.vue';

const removeTitle = el => {
  // Removing titles so its not showing tooltips also

  el.dataset.originalTitle = '';
  el.setAttribute('title', '');
};

const getPreloadedUserInfo = dataset => {
  const userId = dataset.user || dataset.userId;
  const { username, name, avatarUrl } = dataset;

  return {
    userId,
    username,
    name,
    avatarUrl,
  };
};

/**
 * Adds a UserPopover component to the body, hands over as much data as the target element has in data attributes.
 * loads based on data-user-id more data about a user from the API and sets it on the popover
 */
const populateUserInfo = user => {
  const { userId } = user;

  return Promise.all([UsersCache.retrieveById(userId), UsersCache.retrieveStatusById(userId)]).then(
    ([userData, status]) => {
      if (userData) {
        Object.assign(user, {
          avatarUrl: userData.avatar_url,
          username: userData.username,
          name: userData.name,
          location: userData.location,
          bio: userData.bio,
          organization: userData.organization,
          loaded: true,
        });
      }

      if (status) {
        Object.assign(user, {
          status,
        });
      }

      return user;
    },
  );
};

export default (elements = document.querySelectorAll('.js-user-link')) => {
  const userLinks = Array.from(elements);

  return userLinks.map(el => {
    const UserPopoverComponent = Vue.extend(UserPopover);
    const user = {
      location: null,
      bio: null,
      organization: null,
      status: null,
      loaded: false,
    };
    const renderedPopover = new UserPopoverComponent({
      propsData: {
        target: el,
        user,
      },
    });

    renderedPopover.$mount();

    el.addEventListener('mouseenter', ({ target }) => {
      removeTitle(target);
      const preloadedUserInfo = getPreloadedUserInfo(target.dataset);

      Object.assign(user, preloadedUserInfo);

      if (preloadedUserInfo.userId) {
        populateUserInfo(user);
      }
    });
    el.addEventListener('mouseleave', ({ target }) => {
      target.removeAttribute('aria-describedby');
    });

    return renderedPopover;
  });
};