scinote-web/app/assets/javascripts/my_modules.js

270 lines
9 KiB
JavaScript
Raw Normal View History

2019-10-18 17:31:13 +08:00
/* global I18n dropdownSelector */
2019-04-26 21:38:33 +08:00
/* eslint-disable no-use-before-define */
2016-02-12 23:52:43 +08:00
// Bind ajax for editing due dates
2019-11-21 19:14:43 +08:00
function initDueDatePicker() {
function updateDueDate(val) {
2019-11-21 19:14:43 +08:00
var updateUrl = $('.due-date-container').data('update-url');
$.ajax({
url: updateUrl,
type: 'PATCH',
dataType: 'json',
data: { my_module: { due_date: val } },
2019-11-21 19:14:43 +08:00
success: function(result) {
$('.due-date-container').html($(result.module_header_due_date_label));
initDueDatePicker();
}
2019-04-26 21:38:33 +08:00
});
}
$('#calendar-due-date').on('dp.change', function() {
updateDueDate($('#calendar-due-date').val());
});
$('.flex-block.date-block .clear-date').off('click').on('click', function() {
updateDueDate(null);
2016-02-12 23:52:43 +08:00
});
}
2019-11-21 19:14:43 +08:00
2016-02-12 23:52:43 +08:00
// Bind ajax for editing tags
function bindEditTagsAjax() {
var manageTagsModal = null;
var manageTagsModalBody = null;
// Initialize reloading of manage tags modal content after posting new
// tag.
function initAddTagForm() {
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('.add-tag-form')
2019-06-03 15:50:55 +08:00
.submit(function() {
2019-07-02 17:20:49 +08:00
var selectOptions = manageTagsModalBody.find('#new_my_module_tag .dropdown-menu li').length;
if (selectOptions === 0 && this.id === 'new_my_module_tag') return false;
2019-06-03 15:52:04 +08:00
return true;
2019-06-03 15:50:55 +08:00
})
2019-04-26 21:38:33 +08:00
.on('ajax:success', function(e, data) {
2019-10-18 17:31:13 +08:00
var newTag;
2016-02-12 23:52:43 +08:00
initTagsModalBody(data);
2019-10-18 17:31:13 +08:00
newTag = $('#manage-module-tags-modal .list-group-item').last();
dropdownSelector.addValue('#module-tags-selector', {
value: newTag.data('tag-id'),
label: newTag.data('name'),
params: {
color: newTag.data('color')
}
}, true);
2016-02-12 23:52:43 +08:00
});
}
// Initialize edit tag & remove tag functionality from my_module links.
function initTagRowLinks() {
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('.edit-tag-link')
.on('click', function() {
2016-02-12 23:52:43 +08:00
var $this = $(this);
2019-04-26 21:38:33 +08:00
var li = $this.parents('li.list-group-item');
var editDiv = $(li.find('div.tag-edit'));
2016-02-12 23:52:43 +08:00
2016-07-21 19:11:15 +08:00
// Revert all rows to their original states
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('li.list-group-item').each(function() {
var li2 = $(this);
li2.css('background-color', li2.data('color'));
li2.find('.edit-tag-form').clearFormErrors();
li2.find('input[type=text]').val(li2.data('name'));
2016-07-21 19:11:15 +08:00
});
2016-02-12 23:52:43 +08:00
// Hide all other edit divs, show all show divs
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('div.tag-edit').hide();
manageTagsModalBody.find('div.tag-show').show();
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
editDiv.find('input[type=text]').val(li.data('name'));
editDiv.find('.edit-tag-color').colorselector('setColor', li.data('color'));
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
li.find('div.tag-show').hide();
2016-02-12 23:52:43 +08:00
editDiv.show();
});
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('div.tag-edit .dropdown-colorselector > .dropdown-menu li a')
.on('click', function() {
2016-02-12 23:52:43 +08:00
// Change background of the <li>
var $this = $(this);
2019-04-26 21:38:33 +08:00
var li = $this.parents('li.list-group-item');
li.css('background-color', $this.data('value'));
2016-02-12 23:52:43 +08:00
});
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('.remove-tag-link')
.on('ajax:success', function(e, data) {
2019-10-18 17:31:13 +08:00
dropdownSelector.removeValue('#module-tags-selector', this.dataset.tagId, '', true);
2016-02-12 23:52:43 +08:00
initTagsModalBody(data);
});
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('.delete-tag-form')
.on('ajax:success', function(e, data) {
2019-10-18 17:31:13 +08:00
dropdownSelector.removeValue('#module-tags-selector', this.dataset.tagId, '', true);
2016-02-12 23:52:43 +08:00
initTagsModalBody(data);
});
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('.edit-tag-form')
.on('ajax:success', function(e, data) {
2016-02-12 23:52:43 +08:00
initTagsModalBody(data);
})
2019-04-26 21:38:33 +08:00
.on('ajax:error', function(e, data) {
$(this).renderFormErrors('tag', data.responseJSON);
2016-02-12 23:52:43 +08:00
});
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('.cancel-tag-link')
.on('click', function() {
2016-02-12 23:52:43 +08:00
var $this = $(this);
2019-04-26 21:38:33 +08:00
var li = $this.parents('li.list-group-item');
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
li.css('background-color', li.data('color'));
li.find('.edit-tag-form').clearFormErrors();
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
li.find('div.tag-edit').hide();
li.find('div.tag-show').show();
2016-02-12 23:52:43 +08:00
});
}
// Initialize ajax listeners and elements style on modal body. This
// function must be called when modal body is changed.
function initTagsModalBody(data) {
manageTagsModalBody.html(data.html);
2019-04-26 21:38:33 +08:00
manageTagsModalBody.find('.selectpicker').selectpicker();
2016-02-12 23:52:43 +08:00
initAddTagForm();
initTagRowLinks();
}
2019-04-26 21:38:33 +08:00
manageTagsModal = $('#manage-module-tags-modal');
manageTagsModalBody = manageTagsModal.find('.modal-body');
2016-02-12 23:52:43 +08:00
// Reload tags HTML element when modal is closed
2019-04-26 21:38:33 +08:00
manageTagsModal.on('hide.bs.modal', function() {
var tagsEl = $('#module-tags');
2016-02-12 23:52:43 +08:00
// Load HTML
$.ajax({
2019-04-26 21:38:33 +08:00
url: tagsEl.attr('data-module-tags-url'),
type: 'GET',
dataType: 'json',
success: function(data) {
var newOptions = $(data.html_module_header).find('option');
$('#module-tags-selector').find('option').remove();
$(newOptions).appendTo('#module-tags-selector').change();
2016-02-12 23:52:43 +08:00
},
2019-04-26 21:38:33 +08:00
error: function() {
2016-02-12 23:52:43 +08:00
// TODO
}
});
});
// Remove modal content when modal window is closed.
2019-04-26 21:38:33 +08:00
manageTagsModal.on('hidden.bs.modal', function() {
manageTagsModalBody.html('');
2016-02-12 23:52:43 +08:00
});
// initialize my_module tab remote loading
2019-04-26 21:38:33 +08:00
$('.edit-tags-link')
.on('ajax:before', function() {
manageTagsModal.modal('show');
})
.on('ajax:success', function(e, data) {
$('#manage-module-tags-modal-module').text(data.my_module.name);
initTagsModalBody(data);
});
2016-02-12 23:52:43 +08:00
}
// Sets callback for completing/uncompleting task
function applyTaskCompletedCallBack() {
$("[data-action='complete-task'], [data-action='uncomplete-task']")
2018-07-19 23:56:42 +08:00
.on('click', function() {
var button = $(this);
$.ajax({
url: button.data('link-url'),
type: 'POST',
dataType: 'json',
success: function(data) {
if (data.completed === true) {
button.attr('data-action', 'uncomplete-task');
button.find('.btn')
.removeClass('btn-primary').addClass('btn-default');
} else {
button.attr('data-action', 'complete-task');
button.find('.btn')
.removeClass('btn-default').addClass('btn-primary');
}
2019-11-21 19:14:43 +08:00
$('.due-date-container').html(data.module_header_due_date_label);
initDueDatePicker();
2018-07-19 23:56:42 +08:00
$('.task-state-label').html(data.module_state_label);
button.find('button').replaceWith(data.new_btn);
},
error: function() {
}
2018-07-19 23:56:42 +08:00
});
});
}
function initTagsSelector() {
2019-10-18 17:31:13 +08:00
var myModuleTagsSelector = '#module-tags-selector';
2019-04-26 21:38:33 +08:00
2019-10-18 17:31:13 +08:00
dropdownSelector.init(myModuleTagsSelector, {
2019-10-17 16:06:40 +08:00
tagClass: 'my-module-white-tags',
tagStyle: (data) => {
2019-10-18 17:31:13 +08:00
return `background: ${data.params.color}`;
},
customDropdownIcon: () => {
return '';
2019-10-17 16:06:40 +08:00
},
optionLabel: (data) => {
if (data.value > 0) {
2019-10-18 17:31:13 +08:00
return `<span class="my-module-tags-color" style="background:${data.params.color}"></span>
${data.label}`;
2019-10-17 16:06:40 +08:00
}
2019-10-18 17:31:13 +08:00
return `<span class="my-module-tags-color"></span>
${data.label + ' '}
<span class="my-module-tags-create-new"> (${I18n.t('my_modules.module_header.create_new_tag')})</span>`;
},
onOpen: function() {
$('.select-container .edit-button-container').removeClass('hidden');
},
onClose: function() {
$('.select-container .edit-button-container').addClass('hidden');
2019-10-17 16:06:40 +08:00
},
onSelect: function() {
2019-10-18 17:31:13 +08:00
var selectElement = $(myModuleTagsSelector);
2019-10-17 16:06:40 +08:00
var lastTag = selectElement.next().find('.ds-tags').last();
var lastTagId = lastTag.find('.tag-label').data('ds-tag-id');
2019-10-18 17:31:13 +08:00
var newTag;
2019-10-17 16:06:40 +08:00
2019-10-18 17:31:13 +08:00
if (lastTagId > 0) {
newTag = { my_module_tag: { tag_id: lastTagId } };
2019-10-17 16:06:40 +08:00
$.post(selectElement.data('update-module-tags-url'), newTag)
.fail(function() {
2019-10-18 17:31:13 +08:00
dropdownSelector.removeValue(myModuleTagsSelector, lastTagId, '', true);
2019-10-17 16:06:40 +08:00
});
} else {
newTag = {
tag: {
name: lastTag.find('.tag-label').html(),
project_id: selectElement.data('project-id'),
color: null
},
my_module_id: selectElement.data('module-id'),
simple_creation: true
};
$.post(selectElement.data('tags-create-url'), newTag, function(result) {
2019-10-18 17:31:13 +08:00
dropdownSelector.removeValue(myModuleTagsSelector, 0, '', true);
dropdownSelector.addValue(myModuleTagsSelector, {
value: result.tag.id,
label: result.tag.name,
params: {
color: result.tag.color
}
}, true);
2019-10-17 16:06:40 +08:00
});
}
2019-10-18 17:31:13 +08:00
dropdownSelector.closeDropdown(myModuleTagsSelector);
2019-10-17 16:06:40 +08:00
},
onUnSelect: (id) => {
2019-10-18 17:31:13 +08:00
$.post(`${$(myModuleTagsSelector).data('update-module-tags-url')}/${id}/destroy_by_tag_id`);
dropdownSelector.closeDropdown(myModuleTagsSelector);
}
2019-10-18 17:31:13 +08:00
}).getContainer(myModuleTagsSelector).addClass('my-module-tags-container');
}
2018-07-19 23:56:42 +08:00
applyTaskCompletedCallBack();
initTagsSelector();
2016-02-12 23:52:43 +08:00
bindEditTagsAjax();
2019-11-21 20:05:36 +08:00
initDueDatePicker();