At the end of the asynchronous load, the tooltips need to be repositionned, since the size of the content may have changed.
238 lines
6.9 KiB
JavaScript
238 lines
6.9 KiB
JavaScript
// Board related functions
|
|
Kanboard.Board = (function() {
|
|
|
|
var checkInterval = null;
|
|
|
|
function on_popover(e)
|
|
{
|
|
Kanboard.Popover(e, Kanboard.Init);
|
|
}
|
|
|
|
// Setup the board
|
|
function board_load_events()
|
|
{
|
|
// Drag and drop
|
|
$(".column").sortable({
|
|
delay: 300,
|
|
distance: 5,
|
|
connectWith: ".column",
|
|
placeholder: "draggable-placeholder",
|
|
stop: function(event, ui) {
|
|
board_save(
|
|
ui.item.attr('data-task-id'),
|
|
ui.item.parent().attr("data-column-id"),
|
|
ui.item.index() + 1
|
|
);
|
|
}
|
|
});
|
|
|
|
// Assignee change
|
|
$(".assignee-popover").click(Kanboard.Popover);
|
|
|
|
// Category change
|
|
$(".category-popover").click(Kanboard.Popover);
|
|
|
|
// Task edit popover
|
|
$(".task-edit-popover").click(on_popover);
|
|
$(".task-creation-popover").click(on_popover);
|
|
|
|
// Description popover
|
|
$(".task-description-popover").click(on_popover);
|
|
|
|
// Tooltips
|
|
$(".task-board-tooltip").tooltip({
|
|
track: false,
|
|
position: {
|
|
my: 'left-20 top',
|
|
at: 'center bottom+9',
|
|
using: function(position, feedback) {
|
|
|
|
$(this).css(position);
|
|
|
|
var arrow_pos = feedback.target.left + feedback.target.width / 2 - feedback.element.left - 20;
|
|
|
|
$("<div>")
|
|
.addClass("tooltip-arrow")
|
|
.addClass(feedback.vertical)
|
|
.addClass(arrow_pos == 0 ? "align-left" : "align-right")
|
|
.appendTo(this);
|
|
}
|
|
},
|
|
content: function(e) {
|
|
var href = $(this).attr('data-href');
|
|
|
|
if (! href) {
|
|
return;
|
|
}
|
|
|
|
var _this = this;
|
|
$.get(href, function setTooltipContent(data) {
|
|
|
|
$('.ui-tooltip-content:visible').html(data);
|
|
|
|
var tooltip = $('.ui-tooltip:visible');
|
|
|
|
// Clear previous position, it interferes with the updated position computation
|
|
tooltip.css({ top: '', left: '' });
|
|
|
|
// Remove arrow, it will be added when repositionning
|
|
tooltip.children('.tooltip-arrow').remove();
|
|
|
|
// Reposition the tooltip
|
|
var position = $(_this).tooltip("option", "position");
|
|
position.of = $(_this);
|
|
tooltip.position(position);
|
|
|
|
// Toggle subtasks status
|
|
$('#tooltip-subtasks a').click(function(e) {
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
$.get($(this).attr('href'), setTooltipContent);
|
|
});
|
|
});
|
|
|
|
return '<i class="fa fa-refresh fa-spin fa-2x"></i>';
|
|
}
|
|
}).on("mouseenter", function() {
|
|
|
|
var _this = this;
|
|
$(this).tooltip("open");
|
|
|
|
$(".ui-tooltip").on("mouseleave", function () {
|
|
$(_this).tooltip('close');
|
|
});
|
|
|
|
}).on("mouseleave focusout", function (e) {
|
|
|
|
e.stopImmediatePropagation();
|
|
var _this = this;
|
|
|
|
setTimeout(function () {
|
|
if (! $(".ui-tooltip:hover").length) {
|
|
$(_this).tooltip("close");
|
|
}
|
|
}, 100);
|
|
});
|
|
|
|
// Redirect to the task details page
|
|
$("[data-task-url]").each(function() {
|
|
$(this).click(function() {
|
|
window.location = $(this).attr("data-task-url");
|
|
});
|
|
});
|
|
|
|
// Automatic refresh
|
|
var interval = parseInt($("#board").attr("data-check-interval"));
|
|
|
|
if (interval > 0) {
|
|
checkInterval = window.setInterval(board_check, interval * 1000);
|
|
}
|
|
}
|
|
|
|
// Stop events
|
|
function board_unload_events()
|
|
{
|
|
$("[data-task-url]").off();
|
|
clearInterval(checkInterval);
|
|
}
|
|
|
|
// Save and refresh the board
|
|
function board_save(taskId, columnId, position)
|
|
{
|
|
board_unload_events();
|
|
|
|
$.ajax({
|
|
cache: false,
|
|
url: $("#board").attr("data-save-url"),
|
|
contentType: "application/json",
|
|
type: "POST",
|
|
processData: false,
|
|
data: JSON.stringify({
|
|
"task_id": taskId,
|
|
"column_id": columnId,
|
|
"position": position,
|
|
}),
|
|
success: function(data) {
|
|
$("#board").remove();
|
|
$("#main").append(data);
|
|
board_load_events();
|
|
filter_apply();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Check if a board have been changed by someone else
|
|
function board_check()
|
|
{
|
|
if (Kanboard.IsVisible()) {
|
|
$.ajax({
|
|
cache: false,
|
|
url: $("#board").attr("data-check-url"),
|
|
statusCode: {
|
|
200: function(data) {
|
|
$("#board").remove();
|
|
$("#main").append(data);
|
|
board_unload_events();
|
|
board_load_events();
|
|
filter_apply();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// Apply user or date filter (change tasks opacity)
|
|
function filter_apply()
|
|
{
|
|
var selectedUserId = $("#form-user_id").val();
|
|
var selectedCategoryId = $("#form-category_id").val();
|
|
var filterDueDate = $("#filter-due-date").hasClass("filter-on");
|
|
|
|
$("[data-task-id]").each(function(index, item) {
|
|
|
|
var ownerId = item.getAttribute("data-owner-id");
|
|
var dueDate = item.getAttribute("data-due-date");
|
|
var categoryId = item.getAttribute("data-category-id");
|
|
|
|
if (ownerId != selectedUserId && selectedUserId != -1) {
|
|
item.style.opacity = "0.2";
|
|
}
|
|
else {
|
|
item.style.opacity = "1.0";
|
|
}
|
|
|
|
if (filterDueDate && (dueDate == "" || dueDate == "0")) {
|
|
item.style.opacity = "0.2";
|
|
}
|
|
|
|
if (categoryId != selectedCategoryId && selectedCategoryId != -1) {
|
|
item.style.opacity = "0.2";
|
|
}
|
|
});
|
|
}
|
|
|
|
// Load filter events
|
|
function filter_load_events()
|
|
{
|
|
$("#form-user_id").change(filter_apply);
|
|
|
|
$("#form-category_id").change(filter_apply);
|
|
|
|
$("#filter-due-date").click(function(e) {
|
|
$(this).toggleClass("filter-on");
|
|
filter_apply();
|
|
e.preventDefault();
|
|
});
|
|
}
|
|
|
|
return {
|
|
Init: function() {
|
|
board_load_events();
|
|
filter_load_events();
|
|
}
|
|
};
|
|
|
|
})();
|