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

409 lines
14 KiB
JavaScript
Raw Normal View History

2019-04-26 21:38:33 +08:00
/* global I18n */
/* eslint-disable no-use-before-define */
2016-02-12 23:52:43 +08:00
// Bind ajax for editing descriptions
function bindEditDescriptionAjax() {
2019-04-26 21:38:33 +08:00
var editDescriptionModal = $('#manage-module-description-modal');
var editDescriptionModalBody = editDescriptionModal.find('.modal-body');
var editDescriptionModalSubmitBtn = editDescriptionModal.find('[data-action="submit"]');
$('.description-link')
.on('ajax:success', function(ev, data) {
var descriptionLink = $('.description-refresh');
// Set modal body & title
editDescriptionModalBody.html(data.html);
editDescriptionModal
.find('#manage-module-description-modal-label')
.text(data.title);
editDescriptionModalBody.find('form')
.on('ajax:success', function(ev2, data2) {
// Update module's description in the tab
descriptionLink.html(data2.description_label);
// Close modal
editDescriptionModal.modal('hide');
})
.on('ajax:error', function() {
// Display errors if needed
$(this).renderFormErrors('my_module', data.responseJSON);
});
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
// Show modal
editDescriptionModal.modal('show');
})
.on('ajax:error', function() {
2016-02-12 23:52:43 +08:00
// TODO
2019-04-26 21:38:33 +08:00
});
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
editDescriptionModalSubmitBtn.on('click', function() {
2016-02-12 23:52:43 +08:00
// Submit the form inside the modal
2019-04-26 21:38:33 +08:00
editDescriptionModalBody.find('form').submit();
2016-02-12 23:52:43 +08:00
});
2019-04-26 21:38:33 +08:00
editDescriptionModal.on('hidden.bs.modal', function() {
editDescriptionModalBody.find('form').off('ajax:success ajax:error');
editDescriptionModalBody.html('');
2016-02-12 23:52:43 +08:00
});
}
// Bind ajax for editing due dates
function bindEditDueDateAjax() {
var editDueDateModal = null;
var editDueDateModalBody = null;
var editDueDateModalTitle = null;
var editDueDateModalSubmitBtn = null;
2019-04-26 21:38:33 +08:00
editDueDateModal = $('#manage-module-due-date-modal');
editDueDateModalBody = editDueDateModal.find('.modal-body');
editDueDateModalTitle = editDueDateModal.find('#manage-module-due-date-modal-label');
2016-02-12 23:52:43 +08:00
editDueDateModalSubmitBtn = editDueDateModal.find("[data-action='submit']");
2019-04-26 21:38:33 +08:00
$('.due-date-link')
.on('ajax:success', function(ev, data) {
var dueDateLink = $('.task-due-date');
// Load contents
editDueDateModalBody.html(data.html);
editDueDateModalTitle.text(data.title);
// Add listener to form inside modal
editDueDateModalBody.find('form')
.on('ajax:success', function(ev2, data2) {
// Update module's due date
dueDateLink.html(data2.module_header_due_date_label);
// Close modal
editDueDateModal.modal('hide');
})
.on('ajax:error', function() {
// Display errors if needed
$(this).renderFormErrors('my_module', data.responseJSON);
});
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
// Open modal
editDueDateModal.modal('show');
2016-02-12 23:52:43 +08:00
})
2019-04-26 21:38:33 +08:00
.on('ajax:error', function() {
2016-02-12 23:52:43 +08:00
// TODO
2019-04-26 21:38:33 +08:00
});
2016-02-12 23:52:43 +08:00
2019-04-26 21:38:33 +08:00
editDueDateModalSubmitBtn.on('click', function() {
2016-02-12 23:52:43 +08:00
// Submit the form inside the modal
2019-04-26 21:38:33 +08:00
editDueDateModalBody.find('form').submit();
2016-02-12 23:52:43 +08:00
});
2019-04-26 21:38:33 +08:00
editDueDateModal.on('hidden.bs.modal', function() {
editDueDateModalBody.find('form').off('ajax:success ajax:error');
editDueDateModalBody.html('');
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) {
2016-02-12 23:52:43 +08:00
initTagsModalBody(data);
});
}
// 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) {
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) {
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');
}
$('.task-due-date').html(data.module_header_due_date_label);
$('.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() {
var tagsAjaxQuery = {
url: $('#module-tags-selector')[0].dataset.searchTagUrl,
dataType: 'json',
data: function(params) {
return {
query: params.term // search term
};
},
// preparing results
processResults: function(data) {
2019-04-26 21:38:33 +08:00
var output = [];
$.each(data, (index, option) => {
2019-04-26 21:38:33 +08:00
var el = option;
el.text = option.name;
if (option.text.length > 0) {
output.push(el);
}
});
return {
2019-04-26 21:38:33 +08:00
results: output
};
}
};
2019-04-26 21:38:33 +08:00
function tagsCustomResult(state) {
var result = state.id > 0 ? state.text : state.text + ' <span class="create-new">(' + I18n.t('my_modules.module_header.create_new_tag') + ')</span>';
result = '<span class="tag-color" style="background: ' + state.color + '"></span><span>' + result + '</span>';
return $('<div class="add-tags">' + result + '</div>');
}
2019-10-17 16:06:40 +08:00
dropdownSelector.init('#module-tags-selector',{
tagClass: 'my-module-white-tags',
tagStyle: (data) => {
return `background: ${data.params.color}`
},
optionLabel: (data) => {
if (data.value > 0) {
return `<span class="my-module-tags-color" style="background:${data.params.color}"></span>${data.label}`
} else {
return `${data.label}<span class="my-module-tags-create-new"> (${I18n.t('my_modules.module_header.create_new_tag')})</span>`;
}
},
onSelect: function() {
var selectElement = $('#module-tags-selector');
var lastTag = selectElement.next().find('.ds-tags').last();
var lastTagId = lastTag.find('.tag-label').data('ds-tag-id');
if (lastTagId > 0) {
newTag = { my_module_tag: { tag_id: lastTagId } };
$.post(selectElement.data('update-module-tags-url'), newTag)
.fail(function() {
lastTag.remove();
});
} 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) {
var selectedValues = dropdownSelector.getData(selectElement)
lastTag.css('background', result.tag.color)
lastTag.find('.tag-label')[0].dataset.dsTagId = result.tag.id
selectedValues[selectedValues.length - 1].value = result.tag.id
selectedValues[selectedValues.length - 1].params.color = result.tag.color
dropdownSelector.setData(selectElement, selectedValues)
});
}
dropdownSelector.closeDropdown('#module-tags-selector')
},
onUnSelect: (id) => {
$.post(`${$('#module-tags-selector').data('update-module-tags-url')}/${id}/destroy_by_tag_id`);
dropdownSelector.closeDropdown('#module-tags-selector');
}
}).getContainer('#module-tags-selector').addClass('my-module-tags-container');
2019-04-26 21:38:33 +08:00
2019-10-17 16:06:40 +08:00
/*$('#module-tags-selector').select2Multiple({
ajax: tagsAjaxQuery,
unlimitedSize: true,
colorField: 'color',
2019-04-26 21:38:33 +08:00
templateResult: tagsCustomResult,
closeOnSelect: true,
2019-04-26 21:38:33 +08:00
withoutArrow: true,
dynamicCreation: true,
2019-05-08 16:21:59 +08:00
dynamicCreationDelimiter: [','],
placeholderSize: '250px'
}).on('select2:select', (e) => {
var params = e.params.data;
var newTag = null;
var selectElement = e.target;
if (params.id > 0) {
newTag = { my_module_tag: { tag_id: e.params.data.id } };
$.post($('#module-tags-selector')[0].dataset.updateModuleTagsUrl, newTag)
.fail(function() {
$('.module-tags .select2-selection__choice').last().remove();
});
} else {
newTag = {
tag: {
name: params.text,
project_id: selectElement.dataset.projectId,
color: null
},
my_module_id: selectElement.dataset.moduleId,
simple_creation: true
};
$.post(selectElement.dataset.tagsCreateUrl, newTag, function(result) {
var newOption = '<option data-color="' + result.tag.color + '" value="' + result.tag.id + '">' + result.tag.name + '</option>';
var selectedValues = $(selectElement).val();
$(newOption).appendTo($(selectElement));
$(selectElement).find('option[value=0]').remove();
selectedValues.splice(-1, 1);
selectedValues.push(result.tag.id);
$(selectElement).val(selectedValues).change();
});
}
}).on('select2:unselect', (e)=>{
var deleteTag = e.params.data.id;
$(e.target).find('option[value="' + deleteTag + '"]').remove();
$.post($('#module-tags-selector')[0].dataset.updateModuleTagsUrl + '/' + deleteTag + '/destroy_by_tag_id');
})
.prop('disabled', true);
$(window).click(()=>{
$('#module-tags-selector').prop('disabled', true);
$('.select-container .edit-button-container').addClass('hidden');
});
2019-04-26 21:38:33 +08:00
$('#module-tags-selector').next().find('.select2-selection, input').click(e => {
var inputLine = $('#module-tags-selector').next().find('input');
2019-04-26 21:38:33 +08:00
$('#module-tags-selector').select2('open');
if ($('#module-tags-selector')[0].dataset.editable !== 'true') return false;
$('#module-tags-selector').prop('disabled', false);
$('.select-container .edit-button-container').removeClass('hidden');
e.stopPropagation();
inputLine[0].disabled = false;
inputLine.focus();
return true;
2019-10-17 16:06:40 +08:00
});*/
}
2018-07-19 23:56:42 +08:00
applyTaskCompletedCallBack();
2016-02-12 23:52:43 +08:00
bindEditDueDateAjax();
bindEditDescriptionAjax();
initTagsSelector();
2016-02-12 23:52:43 +08:00
bindEditTagsAjax();