Commit 70d780d3 authored by Phil Hughes's avatar Phil Hughes

Merge branch '38869-templates' into 'master'

Export template selector as ES6 modules

See merge request gitlab-org/gitlab-ce!15524
parents 5d9585d1 20180395
This diff is collapsed.
...@@ -30,7 +30,7 @@ import projectImport from './project_import'; ...@@ -30,7 +30,7 @@ import projectImport from './project_import';
import Labels from './labels'; import Labels from './labels';
import LabelManager from './label_manager'; import LabelManager from './label_manager';
/* global Sidebar */ /* global Sidebar */
import IssuableTemplateSelectors from './templates/issuable_template_selectors';
import Flash from './flash'; import Flash from './flash';
import CommitsList from './commits'; import CommitsList from './commits';
import Issue from './issue'; import Issue from './issue';
...@@ -264,7 +264,7 @@ import ProjectVariables from './project_variables'; ...@@ -264,7 +264,7 @@ import ProjectVariables from './project_variables';
new IssuableForm($('.issue-form')); new IssuableForm($('.issue-form'));
new LabelsSelect(); new LabelsSelect();
new MilestoneSelect(); new MilestoneSelect();
new gl.IssuableTemplateSelectors(); new IssuableTemplateSelectors();
break; break;
case 'projects:merge_requests:creations:new': case 'projects:merge_requests:creations:new':
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare'); const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
...@@ -288,7 +288,7 @@ import ProjectVariables from './project_variables'; ...@@ -288,7 +288,7 @@ import ProjectVariables from './project_variables';
new IssuableForm($('.merge-request-form')); new IssuableForm($('.merge-request-form'));
new LabelsSelect(); new LabelsSelect();
new MilestoneSelect(); new MilestoneSelect();
new gl.IssuableTemplateSelectors(); new IssuableTemplateSelectors();
new AutoWidthDropdownSelect($('.js-target-branch-select')).init(); new AutoWidthDropdownSelect($('.js-target-branch-select')).init();
break; break;
case 'projects:tags:new': case 'projects:tags:new':
......
import ImageBadge from '../image_badge'; import ImageBadge from '../image_badge';
import ImageDiff from '../image_diff'; import ImageDiff from '../image_diff';
import ReplacedImageDiff from '../replaced_image_diff'; import ReplacedImageDiff from '../replaced_image_diff';
import '../../commit/image_file'; import ImageFile from '../../commit/image_file';
export function resizeCoordinatesToImageElement(imageEl, meta) { export function resizeCoordinatesToImageElement(imageEl, meta) {
const { x, y, width, height } = meta; const { x, y, width, height } = meta;
...@@ -81,7 +81,7 @@ export function initImageDiff(fileEl, canCreateNote, renderCommentBadge) { ...@@ -81,7 +81,7 @@ export function initImageDiff(fileEl, canCreateNote, renderCommentBadge) {
// ImageFile needs to be invoked before initImageDiff so that badges // ImageFile needs to be invoked before initImageDiff so that badges
// can mount to the correct location // can mount to the correct location
new gl.ImageFile(fileEl); // eslint-disable-line no-new new ImageFile(fileEl); // eslint-disable-line no-new
if (fileEl.querySelector('.diff-file .js-single-image')) { if (fileEl.querySelector('.diff-file .js-single-image')) {
diff = new ImageDiff(fileEl, options); diff = new ImageDiff(fileEl, options);
......
<script> <script>
import IssuableTemplateSelectors from '../../../templates/issuable_template_selectors';
export default { export default {
props: { props: {
formState: { formState: {
...@@ -32,7 +34,7 @@ ...@@ -32,7 +34,7 @@
}; };
editor.getValue = () => this.formState.description; editor.getValue = () => this.formState.description;
this.issuableTemplate = new gl.IssuableTemplateSelectors({ this.issuableTemplate = new IssuableTemplateSelectors({
$dropdowns: $(this.$refs.toggle), $dropdowns: $(this.$refs.toggle),
editor, editor,
}); });
......
/* eslint-disable comma-dangle, max-len, no-useless-return, no-param-reassign, max-len */ /* eslint-disable no-useless-return, max-len */
import Api from '../api';
import Api from '../api';
import TemplateSelector from '../blob/template_selector'; import TemplateSelector from '../blob/template_selector';
((global) => { export default class IssuableTemplateSelector extends TemplateSelector {
class IssuableTemplateSelector extends TemplateSelector { constructor(...args) {
constructor(...args) { super(...args);
super(...args); this.projectPath = this.dropdown.data('project-path');
this.projectPath = this.dropdown.data('project-path'); this.namespacePath = this.dropdown.data('namespace-path');
this.namespacePath = this.dropdown.data('namespace-path'); this.issuableType = this.$dropdownContainer.data('issuable-type');
this.issuableType = this.$dropdownContainer.data('issuable-type'); this.titleInput = $(`#${this.issuableType}_title`);
this.titleInput = $(`#${this.issuableType}_title`);
const initialQuery = {
const initialQuery = { name: this.dropdown.data('selected'),
name: this.dropdown.data('selected') };
};
if (initialQuery.name) this.requestFile(initialQuery);
if (initialQuery.name) this.requestFile(initialQuery);
$('.reset-template', this.dropdown.parent()).on('click', () => {
$('.reset-template', this.dropdown.parent()).on('click', () => { this.setInputValueToTemplateContent();
this.setInputValueToTemplateContent(); });
});
$('.no-template', this.dropdown.parent()).on('click', () => {
$('.no-template', this.dropdown.parent()).on('click', () => { this.currentTemplate.content = '';
this.currentTemplate.content = ''; this.setInputValueToTemplateContent();
this.setInputValueToTemplateContent(); $('.dropdown-toggle-text', this.dropdown).text('Choose a template');
$('.dropdown-toggle-text', this.dropdown).text('Choose a template'); });
}); }
}
requestFile(query) { requestFile(query) {
this.startLoadingSpinner(); this.startLoadingSpinner();
Api.issueTemplate(this.namespacePath, this.projectPath, query.name, this.issuableType, (err, currentTemplate) => { Api.issueTemplate(this.namespacePath, this.projectPath, query.name, this.issuableType, (err, currentTemplate) => {
this.currentTemplate = currentTemplate; this.currentTemplate = currentTemplate;
if (err) return; // Error handled by global AJAX error handler if (err) return; // Error handled by global AJAX error handler
this.stopLoadingSpinner(); this.stopLoadingSpinner();
this.setInputValueToTemplateContent(); this.setInputValueToTemplateContent();
}); });
return; return;
} }
setInputValueToTemplateContent() { setInputValueToTemplateContent() {
// `this.setEditorContent` sets the value of the description input field // `this.setEditorContent` sets the value of the description input field
// to the content of the template selected. // to the content of the template selected.
if (this.titleInput.val() === '') { if (this.titleInput.val() === '') {
// If the title has not yet been set, focus the title input and // If the title has not yet been set, focus the title input and
// skip focusing the description input by setting `true` as the // skip focusing the description input by setting `true` as the
// `skipFocus` option to `setEditorContent`. // `skipFocus` option to `setEditorContent`.
this.setEditorContent(this.currentTemplate, { skipFocus: true }); this.setEditorContent(this.currentTemplate, { skipFocus: true });
this.titleInput.focus(); this.titleInput.focus();
} else { } else {
this.setEditorContent(this.currentTemplate, { skipFocus: false }); this.setEditorContent(this.currentTemplate, { skipFocus: false });
}
return;
} }
return;
} }
}
global.IssuableTemplateSelector = IssuableTemplateSelector;
})(window.gl || (window.gl = {}));
/* eslint-disable no-new, comma-dangle, class-methods-use-this, no-param-reassign */ /* eslint-disable no-new, class-methods-use-this */
import IssuableTemplateSelector from './issuable_template_selector';
((global) => { export default class IssuableTemplateSelectors {
class IssuableTemplateSelectors { constructor({ $dropdowns, editor } = {}) {
constructor({ $dropdowns, editor } = {}) { this.$dropdowns = $dropdowns || $('.js-issuable-selector');
this.$dropdowns = $dropdowns || $('.js-issuable-selector'); this.editor = editor || this.initEditor();
this.editor = editor || this.initEditor();
this.$dropdowns.each((i, dropdown) => { this.$dropdowns.each((i, dropdown) => {
const $dropdown = $(dropdown); const $dropdown = $(dropdown);
new gl.IssuableTemplateSelector({ new IssuableTemplateSelector({
pattern: /(\.md)/, pattern: /(\.md)/,
data: $dropdown.data('data'), data: $dropdown.data('data'),
wrapper: $dropdown.closest('.js-issuable-selector-wrap'), wrapper: $dropdown.closest('.js-issuable-selector-wrap'),
dropdown: $dropdown, dropdown: $dropdown,
editor: this.editor editor: this.editor,
});
}); });
} });
initEditor() {
const editor = $('.markdown-area');
// Proxy ace-editor's .setValue to jQuery's .val
editor.setValue = editor.val;
editor.getValue = editor.val;
return editor;
}
} }
global.IssuableTemplateSelectors = IssuableTemplateSelectors; initEditor() {
})(window.gl || (window.gl = {})); const editor = $('.markdown-area');
// Proxy ace-editor's .setValue to jQuery's .val
editor.setValue = editor.val;
editor.getValue = editor.val;
return editor;
}
}
---
title: Remove template selector from global namespace
merge_request:
author:
type: performance
...@@ -157,27 +157,19 @@ describe('utilsHelper', () => { ...@@ -157,27 +157,19 @@ describe('utilsHelper', () => {
beforeEach(() => { beforeEach(() => {
window.gl = window.gl || (window.gl = {}); window.gl = window.gl || (window.gl = {});
glCache = window.gl; glCache = window.gl;
window.gl.ImageFile = () => {};
fileEl = document.createElement('div'); fileEl = document.createElement('div');
fileEl.innerHTML = ` fileEl.innerHTML = `
<div class="diff-file"></div> <div class="diff-file"></div>
`; `;
spyOn(ImageDiff.prototype, 'init').and.callFake(() => {});
spyOn(ReplacedImageDiff.prototype, 'init').and.callFake(() => {}); spyOn(ReplacedImageDiff.prototype, 'init').and.callFake(() => {});
spyOn(ImageDiff.prototype, 'init').and.callFake(() => {});
}); });
afterEach(() => { afterEach(() => {
window.gl = glCache; window.gl = glCache;
}); });
it('should initialize gl.ImageFile', () => {
spyOn(window.gl, 'ImageFile');
utilsHelper.initImageDiff(fileEl, false, false);
expect(gl.ImageFile).toHaveBeenCalled();
});
it('should initialize ImageDiff if js-single-image', () => { it('should initialize ImageDiff if js-single-image', () => {
const diffFileEl = fileEl.querySelector('.diff-file'); const diffFileEl = fileEl.querySelector('.diff-file');
diffFileEl.innerHTML = ` diffFileEl.innerHTML = `
......
...@@ -34,7 +34,6 @@ describe('Inline edit form component', () => { ...@@ -34,7 +34,6 @@ describe('Inline edit form component', () => {
}); });
it('renders template selector when templates exists', (done) => { it('renders template selector when templates exists', (done) => {
spyOn(gl, 'IssuableTemplateSelectors');
vm.issuableTemplates = ['test']; vm.issuableTemplates = ['test'];
Vue.nextTick(() => { Vue.nextTick(() => {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment