project_select.vue 3.2 KB
Newer Older
F
Felipe Artur 已提交
1 2
<script>
  /* global ListIssue */
3 4

  import $ from 'jquery';
F
Felipe Artur 已提交
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
  import _ from 'underscore';
  import eventHub from '../eventhub';
  import loadingIcon from '../../vue_shared/components/loading_icon.vue';
  import Api from '../../api';

  export default {
    name: 'BoardProjectSelect',
    components: {
      loadingIcon,
    },
    props: {
      groupId: {
        type: Number,
        required: true,
        default: 0,
      },
    },
    data() {
      return {
        loading: true,
        selectedProject: {},
      };
    },
    computed: {
      selectedProjectName() {
        return this.selectedProject.name || 'Select a project';
      },
    },
    mounted() {
      $(this.$refs.projectsDropdown).glDropdown({
        filterable: true,
        filterRemote: true,
        search: {
          fields: ['name_with_namespace'],
        },
        clicked: ({ $el, e }) => {
          e.preventDefault();
          this.selectedProject = {
            id: $el.data('project-id'),
            name: $el.data('project-name'),
          };
          eventHub.$emit('setSelectedProject', this.selectedProject);
        },
        selectable: true,
        data: (term, callback) => {
          this.loading = true;
          return Api.groupProjects(this.groupId, term, (projects) => {
            this.loading = false;
            callback(projects);
          });
        },
        renderRow(project) {
          return `
            <li>
              <a href='#' class='dropdown-menu-link' data-project-id="${project.id}" data-project-name="${project.name}">
                ${_.escape(project.name)}
              </a>
            </li>
          `;
        },
        text: project => project.name,
      });
    },
  };
</script>

<template>
  <div>
    <label class="label-light prepend-top-10">
      Project
    </label>
    <div
      ref="projectsDropdown"
      class="dropdown"
    >
      <button
        class="dropdown-menu-toggle wide"
        type="button"
        data-toggle="dropdown"
        aria-expanded="false"
      >
        {{ selectedProjectName }}
        <i
          class="fa fa-chevron-down"
          aria-hidden="true"
        >
        </i>
      </button>
      <div class="dropdown-menu dropdown-menu-selectable dropdown-menu-full-width">
        <div class="dropdown-title">
          <span>Projects</span>
          <button
            aria-label="Close"
            type="button"
            class="dropdown-title-button dropdown-menu-close"
          >
            <i
              aria-hidden="true"
              data-hidden="true"
              class="fa fa-times dropdown-menu-close-icon"
            >
            </i>
          </button>
        </div>
        <div class="dropdown-input">
          <input
            class="dropdown-input-field"
            type="search"
            placeholder="Search projects"
          />
          <i
            aria-hidden="true"
            data-hidden="true"
            class="fa fa-search dropdown-input-search"
          >
          </i>
        </div>
        <div class="dropdown-content"></div>
        <div class="dropdown-loading">
          <loading-icon />
        </div>
      </div>
    </div>
  </div>
</template>