2017-10-26 16:21:55 -04:00
|
|
|
/* eslint-disable func-names, prefer-rest-params, wrap-iife, no-use-before-define, no-useless-escape, no-new, object-shorthand, no-unused-vars, comma-dangle, no-alert, consistent-return, no-else-return, prefer-template, one-var, one-var-declaration-per-line, curly, max-len */
|
2016-12-14 00:26:26 -05:00
|
|
|
/* global GitLab */
|
|
|
|
|
2017-08-09 07:57:45 -04:00
|
|
|
import Pikaday from 'pikaday';
|
2017-10-12 12:31:29 -04:00
|
|
|
import Autosave from './autosave';
|
2017-05-12 04:15:28 -04:00
|
|
|
import UsersSelect from './users_select';
|
2017-05-16 14:42:06 -04:00
|
|
|
import GfmAutoComplete from './gfm_auto_complete';
|
2017-06-30 17:37:31 -04:00
|
|
|
import ZenMode from './zen_mode';
|
2017-10-18 07:31:01 -04:00
|
|
|
import { parsePikadayDate, pikadayToString } from './lib/utils/datefix';
|
2017-05-12 04:15:28 -04:00
|
|
|
|
2017-10-26 16:21:55 -04:00
|
|
|
export default class IssuableForm {
|
|
|
|
constructor(form) {
|
|
|
|
this.form = form;
|
|
|
|
this.toggleWip = this.toggleWip.bind(this);
|
|
|
|
this.renderWipExplanation = this.renderWipExplanation.bind(this);
|
|
|
|
this.resetAutosave = this.resetAutosave.bind(this);
|
|
|
|
this.handleSubmit = this.handleSubmit.bind(this);
|
|
|
|
this.wipRegex = /^\s*(\[WIP\]\s*|WIP:\s*|WIP\s+)+\s*/i;
|
|
|
|
|
|
|
|
new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources).setup();
|
|
|
|
new UsersSelect();
|
|
|
|
new ZenMode();
|
|
|
|
|
|
|
|
this.titleField = this.form.find('input[name*="[title]"]');
|
|
|
|
this.descriptionField = this.form.find('textarea[name*="[description]"]');
|
|
|
|
if (!(this.titleField.length && this.descriptionField.length)) {
|
|
|
|
return;
|
2016-07-24 16:45:11 -04:00
|
|
|
}
|
|
|
|
|
2017-10-26 16:21:55 -04:00
|
|
|
this.initAutosave();
|
|
|
|
this.form.on('submit', this.handleSubmit);
|
|
|
|
this.form.on('click', '.btn-cancel', this.resetAutosave);
|
|
|
|
this.initWip();
|
|
|
|
|
|
|
|
const $issuableDueDate = $('#issuable-due-date');
|
|
|
|
|
|
|
|
if ($issuableDueDate.length) {
|
|
|
|
const calendar = new Pikaday({
|
|
|
|
field: $issuableDueDate.get(0),
|
|
|
|
theme: 'gitlab-theme animate-picker',
|
|
|
|
format: 'yyyy-mm-dd',
|
|
|
|
container: $issuableDueDate.parent().get(0),
|
|
|
|
parse: dateString => parsePikadayDate(dateString),
|
|
|
|
toString: date => pikadayToString(date),
|
|
|
|
onSelect: dateText => $issuableDueDate.val(calendar.toString(dateText)),
|
|
|
|
});
|
|
|
|
calendar.setDate(parsePikadayDate($issuableDueDate.val()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
initAutosave() {
|
|
|
|
new Autosave(this.titleField, [document.location.pathname, document.location.search, 'title']);
|
|
|
|
return new Autosave(this.descriptionField, [document.location.pathname, document.location.search, 'description']);
|
|
|
|
}
|
|
|
|
|
|
|
|
handleSubmit() {
|
|
|
|
return this.resetAutosave();
|
|
|
|
}
|
|
|
|
|
|
|
|
resetAutosave() {
|
|
|
|
this.titleField.data('autosave').reset();
|
|
|
|
return this.descriptionField.data('autosave').reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
initWip() {
|
|
|
|
this.$wipExplanation = this.form.find('.js-wip-explanation');
|
|
|
|
this.$noWipExplanation = this.form.find('.js-no-wip-explanation');
|
|
|
|
if (!(this.$wipExplanation.length && this.$noWipExplanation.length)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.form.on('click', '.js-toggle-wip', this.toggleWip);
|
|
|
|
this.titleField.on('keyup blur', this.renderWipExplanation);
|
|
|
|
return this.renderWipExplanation();
|
|
|
|
}
|
|
|
|
|
|
|
|
workInProgress() {
|
|
|
|
return this.wipRegex.test(this.titleField.val());
|
|
|
|
}
|
|
|
|
|
|
|
|
renderWipExplanation() {
|
|
|
|
if (this.workInProgress()) {
|
|
|
|
this.$wipExplanation.show();
|
|
|
|
return this.$noWipExplanation.hide();
|
|
|
|
} else {
|
|
|
|
this.$wipExplanation.hide();
|
|
|
|
return this.$noWipExplanation.show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleWip(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
if (this.workInProgress()) {
|
|
|
|
this.removeWip();
|
|
|
|
} else {
|
|
|
|
this.addWip();
|
|
|
|
}
|
|
|
|
return this.renderWipExplanation();
|
|
|
|
}
|
|
|
|
|
|
|
|
removeWip() {
|
|
|
|
return this.titleField.val(this.titleField.val().replace(this.wipRegex, ''));
|
|
|
|
}
|
|
|
|
|
|
|
|
addWip() {
|
|
|
|
this.titleField.val(`WIP: ${(this.titleField.val())}`);
|
|
|
|
}
|
|
|
|
}
|