scinote-web/app/assets/javascripts/projects/index.js.erb

343 lines
10 KiB
Text
Raw Normal View History

2016-02-12 23:52:43 +08:00
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// TODO
// - error handling of assigning user to project, check XHR data.errors
// - error handling of removing user from project, check XHR data.errors
// - refresh project users tab after manage user modal is closed
// - refactor view handling using library, ex. backbone.js
//= require comments
2016-02-12 23:52:43 +08:00
(function () {
var newProjectModal = null;
var newProjectModalForm = null;
2016-07-21 19:11:15 +08:00
var newProjectModalBody = null;
2016-02-12 23:52:43 +08:00
var newProjectBtn = null;
var editProjectModal = null;
var editProjectModalTitle = null;
var editProjectModalBody = null;
2016-02-12 23:52:43 +08:00
var editProjectBtn = null;
2018-06-01 22:14:50 +08:00
var projectActionsModal = null;
var projectActionsModalHeader = null;
var projectActionsModalBody = null;
var projectActionsModalFooter = null;
2016-02-12 23:52:43 +08:00
/**
* Stupid Bootstrap btn-group bug hotfix
* @param btnGroup - The button group element.
*/
function activateBtnGroup(btnGroup) {
var btns = btnGroup.find(".btn");
btns.find("input[type='radio']")
.removeAttr("checked")
.prop("checked", false);
btns.filter(".active")
.find("input[type='radio']")
.attr("checked", "checked")
.prop("checked", true);
}
/**
* Initializes page
*/
function init() {
newProjectModal = $('#new-project-modal');
newProjectModalForm = newProjectModal.find('form');
newProjectModalBody = newProjectModal.find('.modal-body');
newProjectBtn = $('#new-project-btn');
editProjectModal = $('#edit-project-modal');
editProjectModalTitle = editProjectModal.find('#edit-project-modal-label');
editProjectModalBody = editProjectModal.find('.modal-body');
editProjectBtn = editProjectModal.find(".btn[data-action='submit']");
2018-06-01 22:14:50 +08:00
projectActionsModal = $('#project-actions-modal');
projectActionsModalHeader = projectActionsModal.find('.modal-title');
projectActionsModalBody = projectActionsModal.find('.modal-body');
projectActionsModalFooter = projectActionsModal.find('.modal-footer');
initNewProjectModal();
initEditProjectModal();
initManageUsersModal();
Comments.initCommentOptions('ul.content-comments', true);
Comments.initEditComments('.panel-project .tab-content');
Comments.initDeleteComments('.panel-project .tab-content');
// initialize project tab remote loading
2018-07-19 23:56:42 +08:00
$('.panel-project .active').removeClass('active');
$('.panel-project .panel-footer [role=tab]')
.on('ajax:before', function(e) {
var $this = $(this);
var parentNode = $this.parents('li');
var targetId = $this.attr('aria-controls');
if (parentNode.hasClass('active')) {
// TODO move to fn
parentNode.removeClass('active');
$('#' + targetId).removeClass('active');
return false;
}
})
.on('ajax:success', function(e, data, status, xhr) {
var $this = $(this);
var targetId = $this.attr('aria-controls');
var target = $('#' + targetId);
var parentNode = $this.parents('ul').parent();
target.html(data.html);
initUsersEditLink(parentNode);
Comments.form(parentNode);
Comments.moreComments(parentNode);
// TODO move to fn
parentNode.find('.active').removeClass('active');
$this.parents('li').addClass('active');
target.addClass('active');
Comments.scrollBottom(parentNode);
})
.on('ajax:error', function() {
// TODO
});
}
2016-02-12 23:52:43 +08:00
/**
* Initialize the JS for new project modal to work.
*/
function initNewProjectModal() {
newProjectModalForm.submit(function() {
// Stupid Bootstrap btn-group bug hotfix
activateBtnGroup(
newProjectModal
.find("form .btn-group[data-toggle='buttons']")
);
});
newProjectModal.on("hidden.bs.modal", function () {
// When closing the new project modal, clear its input vals
// and potential errors
newProjectModalForm.clearFormErrors();
2016-02-12 23:52:43 +08:00
// Clear input fields
newProjectModalForm.clearFormFields();
2017-01-25 19:12:27 +08:00
var teamSelect = newProjectModalForm.find('select#project_team_id');
teamSelect.val(0);
teamSelect.selectpicker('refresh');
var teamHidden = newProjectModalForm.find('input#project_visibility_hidden');
var teamVisible = newProjectModalForm.find('input#project_visibility_visible');
teamHidden.prop("checked", true);
teamHidden.attr("checked", "checked");
teamHidden.parent().addClass("active");
teamVisible.prop("checked", false);
teamVisible.parent().removeClass("active");
2016-02-12 23:52:43 +08:00
})
.on("show.bs.modal", function() {
2017-01-25 19:12:27 +08:00
var teamSelect = newProjectModalForm.find('select#project_team_id');
teamSelect.selectpicker('refresh');
2016-02-12 23:52:43 +08:00
});
newProjectModalForm
2016-07-21 19:11:15 +08:00
.on("ajax:beforeSend", function(){
animateSpinner(newProjectModalBody);
})
2016-02-12 23:52:43 +08:00
.on("ajax:success", function(data, status, jqxhr) {
// Redirect to response page
$(location).attr("href", status.url);
})
.on("ajax:error", function(jqxhr, status, error) {
$(this).renderFormErrors("project", status.responseJSON);
2016-07-21 19:11:15 +08:00
})
.on("ajax:complete", function(){
animateSpinner(newProjectModalBody, false);
2016-02-12 23:52:43 +08:00
});
newProjectBtn.click(function(e) {
// Show the modal
newProjectModal.modal("show");
return false;
});
}
/**
* Initialize the JS for edit project modal to work.
*/
function initEditProjectModal() {
// Edit button click handler
editProjectBtn.click(function() {
// Stupid Bootstrap btn-group bug hotfix
activateBtnGroup(
editProjectModalBody
.find("form .btn-group[data-toggle='buttons']")
);
// Submit the modal body's form
editProjectModalBody.find("form").submit();
});
// On hide modal handler
editProjectModal.on("hidden.bs.modal", function() {
editProjectModalBody.html("");
});
$(".panel-project a[data-action='edit']")
.on("ajax:success", function(ev, data, status) {
// Update modal title
editProjectModalTitle.html(data.title);
// Set modal body
editProjectModalBody.html(data.html);
// Add modal body's submit handler
editProjectModal.find("form")
2016-07-21 19:11:15 +08:00
.on("ajax:beforeSend", function(){
animateSpinner(this);
})
2016-02-12 23:52:43 +08:00
.on("ajax:success", function(ev2, data2, status2) {
// Project saved, replace changed project's title
var responseHtml = $(data2.html);
var id = responseHtml.attr("data-id");
var newTitle = responseHtml.find(".panel-title");
var existingTitle =
$(".panel-project[data-id='" + id + "'] .panel-title");
existingTitle.after(newTitle);
existingTitle.remove();
// Hide modal
editProjectModal.modal("hide");
})
.on("ajax:error", function(ev2, data2, status2) {
$(this).renderFormErrors("project", data2.responseJSON);
2016-07-21 19:11:15 +08:00
})
.on("ajax:complete", function(){
animateSpinner(this, false);
2016-02-12 23:52:43 +08:00
});
// Show the modal
editProjectModal.modal("show");
})
.on("ajax:error", function(ev, data, status) {
// TODO
});
}
function initManageUsersModal() {
// Reload users tab HTML element when modal is closed
2018-06-01 22:14:50 +08:00
projectActionsModal.on("hide.bs.modal", function () {
2016-02-12 23:52:43 +08:00
var projectEl = $("#" + $(this).attr("data-project-id"));
// Load HTML to refresh users list
$.ajax({
url: projectEl.attr("data-project-users-tab-url"),
type: "GET",
dataType: "json",
success: function (data) {
projectEl.find("#users-" + projectEl.attr("id")).html(data.html);
CounterBadge.updateCounterBadge(data.counter,
data.project_id,
'users');
2016-02-12 23:52:43 +08:00
initUsersEditLink(projectEl);
},
error: function (data) {
// TODO
}
});
});
// Remove modal content when modal window is closed.
2018-06-01 22:14:50 +08:00
projectActionsModal.on("hidden.bs.modal", function () {
projectActionsModalHeader.html("");
projectActionsModalBody.html("");
projectActionsModalFooter.html("");
2016-02-12 23:52:43 +08:00
});
}
// Initialize users editing modal remote loading.
function initUsersEditLink($el) {
$el.find(".manage-users-link")
.on("ajax:before", function () {
var projectId = $(this).closest(".panel-default").attr("id");
2018-06-01 22:14:50 +08:00
projectActionsModal.attr("data-project-id", projectId);
projectActionsModal.modal('show');
2016-02-12 23:52:43 +08:00
})
.on("ajax:success", function (e, data) {
$("#manage-users-modal-project").text(data.project.name);
initUsersModalBody(data);
});
}
// Initialize reloading manage user modal content after posting new
// user.
2016-09-27 15:00:02 +08:00
2016-02-12 23:52:43 +08:00
function initAddUserForm() {
2018-06-01 22:14:50 +08:00
projectActionsModalBody.find(".add-user-form")
2016-02-12 23:52:43 +08:00
.on("ajax:success", function (e, data) {
initUsersModalBody(data);
if (data.status === 'error') {
$(this).addClass("has-error");
2016-07-21 19:11:15 +08:00
var errorBlock = $(this).find("span.help-block");
if (errorBlock .length && errorBlock.length > 0) {
errorBlock.html(data.error);
} else {
$(this).append("<span class='help-block col-xs-8'>" + data.error + "</span>");
}
2016-02-12 23:52:43 +08:00
}
});
}
// Initialize remove user from project links.
function initRemoveUserLinks() {
2018-06-01 22:14:50 +08:00
projectActionsModalBody.find(".remove-user-link")
2016-02-12 23:52:43 +08:00
.on("ajax:success", function (e, data) {
initUsersModalBody(data);
});
}
//
function initUserRoleForms() {
2018-06-01 22:14:50 +08:00
projectActionsModalBody.find(".update-user-form select")
2016-02-12 23:52:43 +08:00
.on("change", function () {
$(this).parents("form").submit();
});
2018-06-01 22:14:50 +08:00
projectActionsModalBody.find(".update-user-form")
2016-02-12 23:52:43 +08:00
.on("ajax:success", function (e, data) {
initUsersModalBody(data);
})
.on("ajax:error", function (e, xhr, status, error) {
// TODO
});
}
// Initialize ajax listeners and elements style on modal body. This
// function must be called when modal body is changed.
function initUsersModalBody(data) {
2018-06-01 22:14:50 +08:00
projectActionsModalHeader.html(data.html_header);
projectActionsModalBody.html(data.html_body);
projectActionsModalFooter.html(data.html_footer);
projectActionsModalBody.find(".selectpicker").selectpicker();
2016-02-12 23:52:43 +08:00
initAddUserForm();
initRemoveUserLinks();
initUserRoleForms();
}
init();
2016-08-11 18:40:16 +08:00
}());