summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/projects_dropdown/index.js
blob: 2660da3c5589e58c526bc0c58d352720d63e09d6 (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
import Vue from 'vue';

import Translate from '../vue_shared/translate';
import eventHub from './event_hub';
import ProjectsService from './service/projects_service';
import ProjectsStore from './store/projects_store';

import projectsDropdownApp from './components/app.vue';

Vue.use(Translate);

document.addEventListener('DOMContentLoaded', () => {
  const el = document.getElementById('js-projects-dropdown');
  const navEl = document.getElementById('nav-projects-dropdown');

  // Don't do anything if element doesn't exist (No projects dropdown)
  // This is for when the user accesses GitLab without logging in
  if (!el || !navEl) {
    return;
  }

  $(navEl).on('show.bs.dropdown', (e) => {
    const dropdownEl = $(e.currentTarget).find('.projects-dropdown-menu');
    dropdownEl.one('transitionend', () => {
      eventHub.$emit('dropdownOpen');
    });
  });

  // eslint-disable-next-line no-new
  new Vue({
    el,
    components: {
      projectsDropdownApp,
    },
    data() {
      const dataset = this.$options.el.dataset;
      const store = new ProjectsStore();
      const service = new ProjectsService(dataset.userName);

      const project = {
        id: Number(dataset.projectId),
        name: dataset.projectName,
        namespace: dataset.projectNamespace,
        webUrl: dataset.projectWebUrl,
        avatarUrl: dataset.projectAvatarUrl || null,
        lastAccessedOn: Date.now(),
      };

      return {
        store,
        service,
        state: store.state,
        currentUserName: dataset.userName,
        currentProject: project,
      };
    },
    render(createElement) {
      return createElement('projects-dropdown-app', {
        props: {
          currentUserName: this.currentUserName,
          currentProject: this.currentProject,
          store: this.store,
          service: this.service,
        },
      });
    },
  });
});