summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/templates/issuable_template_selector.js
blob: b5b64f44a11adef1b1d922494006220291ec22dc (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
/* eslint-disable no-useless-return, max-len */

import Api from '../api';
import TemplateSelector from '../blob/template_selector';

export default class IssuableTemplateSelector extends TemplateSelector {
  constructor(...args) {
    super(...args);
    this.projectPath = this.dropdown.data('projectPath');
    this.namespacePath = this.dropdown.data('namespacePath');
    this.issuableType = this.$dropdownContainer.data('issuableType');
    this.titleInput = $(`#${this.issuableType}_title`);

    const initialQuery = {
      name: this.dropdown.data('selected'),
    };

    if (initialQuery.name) this.requestFile(initialQuery);

    $('.reset-template', this.dropdown.parent()).on('click', () => {
      this.setInputValueToTemplateContent();
    });

    $('.no-template', this.dropdown.parent()).on('click', () => {
      this.currentTemplate.content = '';
      this.setInputValueToTemplateContent();
      $('.dropdown-toggle-text', this.dropdown).text('Choose a template');
    });
  }

  requestFile(query) {
    this.startLoadingSpinner();
    Api.issueTemplate(this.namespacePath, this.projectPath, query.name, this.issuableType, (err, currentTemplate) => {
      this.currentTemplate = currentTemplate;
      this.stopLoadingSpinner();
      if (err) return; // Error handled by global AJAX error handler
      this.setInputValueToTemplateContent();
    });
    return;
  }

  setInputValueToTemplateContent() {
    // `this.setEditorContent` sets the value of the description input field
    // to the content of the template selected.
    if (this.titleInput.val() === '') {
      // If the title has not yet been set, focus the title input and
      // skip focusing the description input by setting `true` as the
      // `skipFocus` option to `setEditorContent`.
      this.setEditorContent(this.currentTemplate, { skipFocus: true });
      this.titleInput.focus();
    } else {
      this.setEditorContent(this.currentTemplate, { skipFocus: false });
    }
    return;
  }
}