Created a class to share functionality of creating new label from dropdown
This commit is contained in:
parent
7dd9b0dd3c
commit
d1a2be9f36
4 changed files with 134 additions and 65 deletions
|
@ -1,7 +1,9 @@
|
||||||
$(() => {
|
$(function () {
|
||||||
$('.js-new-board-list').each(function () {
|
$('.js-new-board-list').each(function () {
|
||||||
const $this = $(this);
|
const $this = $(this);
|
||||||
|
|
||||||
|
new gl.CreateLabelDropdown($this.closest('.dropdown').find('.dropdown-new-label'), $this.data('project-id'));
|
||||||
|
|
||||||
$this.glDropdown({
|
$this.glDropdown({
|
||||||
data: function(term, callback) {
|
data: function(term, callback) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|
126
app/assets/javascripts/create_label.js.es6
Normal file
126
app/assets/javascripts/create_label.js.es6
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
(function (w) {
|
||||||
|
class CreateLabelDropdown {
|
||||||
|
constructor ($el, projectId) {
|
||||||
|
this.$el = $el;
|
||||||
|
this.projectId = projectId;
|
||||||
|
this.$dropdownBack = $('.dropdown-menu-back', this.$el.closest('.dropdown'));
|
||||||
|
this.$cancelButton = $('.js-cancel-label-btn', this.$el);
|
||||||
|
this.$newLabelField = $('#new_label_name', this.$el);
|
||||||
|
this.$newColorField = $('#new_label_color', this.$el);
|
||||||
|
this.$colorPreview = $('.js-dropdown-label-color-preview', this.$el);
|
||||||
|
this.$newLabelError = $('.js-label-error', this.$el);
|
||||||
|
this.$newLabelCreateButton = $('.js-new-label-btn', this.$el);
|
||||||
|
this.$colorSuggestions = $('.suggest-colors-dropdown a', this.$el);
|
||||||
|
|
||||||
|
this.$newLabelError.hide();
|
||||||
|
this.$newLabelCreateButton.disable();
|
||||||
|
|
||||||
|
this.cleanBinding();
|
||||||
|
this.addBinding();
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanBinding () {
|
||||||
|
this.$colorSuggestions.off('click');
|
||||||
|
this.$newLabelField.off('keyup change');
|
||||||
|
this.$newColorField.off('keyup change');
|
||||||
|
this.$dropdownBack.off('click');
|
||||||
|
this.$cancelButton.off('click');
|
||||||
|
this.$newLabelCreateButton.off('click');
|
||||||
|
}
|
||||||
|
|
||||||
|
addBinding () {
|
||||||
|
const self = this;
|
||||||
|
|
||||||
|
this.$colorSuggestions.on('click', function (e) {
|
||||||
|
const $this = $(this);
|
||||||
|
self.addColorValue(e, $this);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$newLabelField.on('keyup change', this.enableLabelCreateButton.bind(this));
|
||||||
|
this.$newColorField.on('keyup change', this.enableLabelCreateButton.bind(this));
|
||||||
|
|
||||||
|
this.$dropdownBack.on('click', this.resetForm.bind(this));
|
||||||
|
|
||||||
|
this.$cancelButton.on('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
self.resetForm();
|
||||||
|
self.$dropdownBack.trigger('click');
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$newLabelCreateButton.on('click', this.saveLabel.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
addColorValue (e, $this) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
this.$newColorField.val($this.data('color')).trigger('change');
|
||||||
|
this.$colorPreview
|
||||||
|
.css('background-color', $this.data('color'))
|
||||||
|
.parent()
|
||||||
|
.addClass('is-active');
|
||||||
|
}
|
||||||
|
|
||||||
|
enableLabelCreateButton () {
|
||||||
|
if (this.$newLabelField.val() !== '' && this.$newColorField.val() !== '') {
|
||||||
|
this.$newLabelError.hide();
|
||||||
|
this.$newLabelCreateButton.enable();
|
||||||
|
} else {
|
||||||
|
this.$newLabelCreateButton.disable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resetForm () {
|
||||||
|
this.$newLabelField
|
||||||
|
.val('')
|
||||||
|
.trigger('change');
|
||||||
|
|
||||||
|
this.$newColorField
|
||||||
|
.val('')
|
||||||
|
.trigger('change');
|
||||||
|
|
||||||
|
this.$colorPreview
|
||||||
|
.css('background-color', '')
|
||||||
|
.parent()
|
||||||
|
.removeClass('is-active');
|
||||||
|
}
|
||||||
|
|
||||||
|
saveLabel (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
Api.newLabel(this.projectId, {
|
||||||
|
name: this.$newLabelField.val(),
|
||||||
|
color: this.$newColorField.val()
|
||||||
|
}, (label) => {
|
||||||
|
this.$newLabelCreateButton.enable();
|
||||||
|
|
||||||
|
if (label.message) {
|
||||||
|
let errors;
|
||||||
|
|
||||||
|
if (typeof label.message === 'string') {
|
||||||
|
errors = label.message;
|
||||||
|
} else {
|
||||||
|
errors = _.map(label.message, function (value, key) {
|
||||||
|
return key + " " + value[0];
|
||||||
|
}).join("<br/>");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$newLabelError
|
||||||
|
.html(errors)
|
||||||
|
.show();
|
||||||
|
} else {
|
||||||
|
this.$dropdownBack.trigger('click');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!w.gl) {
|
||||||
|
w.gl = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
gl.CreateLabelDropdown = CreateLabelDropdown;
|
||||||
|
})(window);
|
|
@ -4,7 +4,7 @@
|
||||||
var _this;
|
var _this;
|
||||||
_this = this;
|
_this = this;
|
||||||
$('.js-label-select').each(function(i, dropdown) {
|
$('.js-label-select').each(function(i, dropdown) {
|
||||||
var $block, $colorPreview, $dropdown, $form, $loading, $newLabelCreateButton, $newLabelError, $selectbox, $sidebarCollapsedValue, $value, abilityName, defaultLabel, enableLabelCreateButton, issueURLSplit, issueUpdateURL, labelHTMLTemplate, labelNoneHTMLTemplate, labelUrl, newColorField, newLabelField, projectId, resetForm, saveLabel, saveLabelData, selectedLabel, showAny, showNo;
|
var $block, $colorPreview, $dropdown, $form, $loading, $selectbox, $sidebarCollapsedValue, $value, abilityName, defaultLabel, enableLabelCreateButton, issueURLSplit, issueUpdateURL, labelHTMLTemplate, labelNoneHTMLTemplate, labelUrl, projectId, saveLabelData, selectedLabel, showAny, showNo;
|
||||||
$dropdown = $(dropdown);
|
$dropdown = $(dropdown);
|
||||||
projectId = $dropdown.data('project-id');
|
projectId = $dropdown.data('project-id');
|
||||||
labelUrl = $dropdown.data('labels');
|
labelUrl = $dropdown.data('labels');
|
||||||
|
@ -13,8 +13,6 @@
|
||||||
if ((selectedLabel != null) && !$dropdown.hasClass('js-multiselect')) {
|
if ((selectedLabel != null) && !$dropdown.hasClass('js-multiselect')) {
|
||||||
selectedLabel = selectedLabel.split(',');
|
selectedLabel = selectedLabel.split(',');
|
||||||
}
|
}
|
||||||
newLabelField = $('#new_label_name');
|
|
||||||
newColorField = $('#new_label_color');
|
|
||||||
showNo = $dropdown.data('show-no');
|
showNo = $dropdown.data('show-no');
|
||||||
showAny = $dropdown.data('show-any');
|
showAny = $dropdown.data('show-any');
|
||||||
defaultLabel = $dropdown.data('default-label');
|
defaultLabel = $dropdown.data('default-label');
|
||||||
|
@ -24,10 +22,6 @@
|
||||||
$form = $dropdown.closest('form');
|
$form = $dropdown.closest('form');
|
||||||
$sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span');
|
$sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span');
|
||||||
$value = $block.find('.value');
|
$value = $block.find('.value');
|
||||||
$newLabelError = $('.js-label-error');
|
|
||||||
$colorPreview = $('.js-dropdown-label-color-preview');
|
|
||||||
$newLabelCreateButton = $('.js-new-label-btn');
|
|
||||||
$newLabelError.hide();
|
|
||||||
$loading = $block.find('.block-loading').fadeOut();
|
$loading = $block.find('.block-loading').fadeOut();
|
||||||
if (issueUpdateURL != null) {
|
if (issueUpdateURL != null) {
|
||||||
issueURLSplit = issueUpdateURL.split('/');
|
issueURLSplit = issueUpdateURL.split('/');
|
||||||
|
@ -36,62 +30,9 @@
|
||||||
labelHTMLTemplate = _.template('<% _.each(labels, function(label){ %> <a href="<%- ["",issueURLSplit[1], issueURLSplit[2],""].join("/") %>issues?label_name[]=<%- encodeURIComponent(label.title) %>"> <span class="label has-tooltip color-label" title="<%- label.description %>" style="background-color: <%- label.color %>; color: <%- label.text_color %>;"> <%- label.title %> </span> </a> <% }); %>');
|
labelHTMLTemplate = _.template('<% _.each(labels, function(label){ %> <a href="<%- ["",issueURLSplit[1], issueURLSplit[2],""].join("/") %>issues?label_name[]=<%- encodeURIComponent(label.title) %>"> <span class="label has-tooltip color-label" title="<%- label.description %>" style="background-color: <%- label.color %>; color: <%- label.text_color %>;"> <%- label.title %> </span> </a> <% }); %>');
|
||||||
labelNoneHTMLTemplate = '<span class="no-value">None</span>';
|
labelNoneHTMLTemplate = '<span class="no-value">None</span>';
|
||||||
}
|
}
|
||||||
if (newLabelField.length) {
|
|
||||||
$('.suggest-colors-dropdown a').on("click", function(e) {
|
new gl.CreateLabelDropdown($dropdown.closest('.dropdown').find('.dropdown-new-label'), projectId);
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
newColorField.val($(this).data('color')).trigger('change');
|
|
||||||
return $colorPreview.css('background-color', $(this).data('color')).parent().addClass('is-active');
|
|
||||||
});
|
|
||||||
resetForm = function() {
|
|
||||||
newLabelField.val('').trigger('change');
|
|
||||||
newColorField.val('').trigger('change');
|
|
||||||
return $colorPreview.css('background-color', '').parent().removeClass('is-active');
|
|
||||||
};
|
|
||||||
$('.dropdown-menu-back').on('click', function() {
|
|
||||||
return resetForm();
|
|
||||||
});
|
|
||||||
$('.js-cancel-label-btn').on('click', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
resetForm();
|
|
||||||
return $('.dropdown-menu-back', $dropdown.parent()).trigger('click');
|
|
||||||
});
|
|
||||||
enableLabelCreateButton = function() {
|
|
||||||
if (newLabelField.val() !== '' && newColorField.val() !== '') {
|
|
||||||
$newLabelError.hide();
|
|
||||||
return $newLabelCreateButton.enable();
|
|
||||||
} else {
|
|
||||||
return $newLabelCreateButton.disable();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
saveLabel = function() {
|
|
||||||
return Api.newLabel(projectId, {
|
|
||||||
name: newLabelField.val(),
|
|
||||||
color: newColorField.val()
|
|
||||||
}, function(label) {
|
|
||||||
$newLabelCreateButton.enable();
|
|
||||||
if (label.message != null) {
|
|
||||||
var errorText = label.message;
|
|
||||||
if (_.isObject(label.message)) {
|
|
||||||
errorText = _.map(label.message, function(value, key) {
|
|
||||||
return key + " " + value[0];
|
|
||||||
}).join('<br/>');
|
|
||||||
}
|
|
||||||
return $newLabelError.html(errorText).show();
|
|
||||||
} else {
|
|
||||||
return $('.dropdown-menu-back', $dropdown.parent()).trigger('click');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
newLabelField.on('keyup change', enableLabelCreateButton);
|
|
||||||
newColorField.on('keyup change', enableLabelCreateButton);
|
|
||||||
$newLabelCreateButton.disable().on('click', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
return saveLabel();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
saveLabelData = function() {
|
saveLabelData = function() {
|
||||||
var data, selected;
|
var data, selected;
|
||||||
selected = $dropdown.closest('.selectbox').find("input[name='" + ($dropdown.data('field-name')) + "']").map(function() {
|
selected = $dropdown.closest('.selectbox').find("input[name='" + ($dropdown.data('field-name')) + "']").map(function() {
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
= render 'shared/sort_dropdown'
|
= render 'shared/sort_dropdown'
|
||||||
- elsif current_user
|
- elsif current_user
|
||||||
.dropdown
|
.dropdown
|
||||||
%button.btn.btn-create.js-new-board-list{ type: "button", data: { toggle: "dropdown", labels: labels_filter_path } }
|
%button.btn.btn-create.js-new-board-list{ type: "button", data: { toggle: "dropdown", labels: labels_filter_path, project_id: @project.try(:id) } }
|
||||||
Create new list
|
Create new list
|
||||||
.dropdown-menu.dropdown-menu-paging.dropdown-menu-align-right.dropdown-menu-issues-board-new.dropdown-menu-selectable
|
.dropdown-menu.dropdown-menu-paging.dropdown-menu-align-right.dropdown-menu-issues-board-new.dropdown-menu-selectable
|
||||||
= render partial: "shared/issuable/label_page_default", locals: { show_footer: true, show_create: true, show_boards_content: true, title: "Create a new list" }
|
= render partial: "shared/issuable/label_page_default", locals: { show_footer: true, show_create: true, show_boards_content: true, title: "Create a new list" }
|
||||||
|
|
Loading…
Reference in a new issue