Files
Kanboard-Prod/assets/js/board.js
Francois Ferrand 73e2282259 Reposition the tooltip when they are loaded.
At the end of the asynchronous load, the tooltips need to be
repositionned, since the size of the content may have changed.
2014-12-04 18:37:56 +01:00

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();
}
};
})();