summaryrefslogtreecommitdiff
path: root/plugins/Bigboard/Asset/js/BoardDragAndDrop.js
blob: b6b7b8c341322d87cb6835d366f6cfd46a881ab9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Kanboard.BoardDragAndDrop = function(app) {
    this.app = app;
    this.savingInProgress = false;
};

Kanboard.BoardDragAndDrop.prototype.execute = function() {
    if (this.app.hasId("board")) {
        this.executeListeners();
        this.dragAndDrop();
    }
};

Kanboard.BoardDragAndDrop.prototype.dragAndDrop = function() {
    var self = this;
    var dropzone = $(".board-task-list");

    // Run for every Board List, connecting the Items within the same project id
    dropzone.each(function() {
        // Set dropzone height to the height of the table cell
        $(this).css("min-height", $(this).parent().height());

        var project_id = $(this).closest("table[id=board]").attr("data-project-id");

        var params = {
            forcePlaceholderSize: true,
            tolerance: "pointer",
            connectWith: ".sortable-column[data-project-id=" + project_id + "]",
            placeholder: "draggable-placeholder",
            items: ".draggable-item[data-project-id=" + project_id + "]",
            stop: function(event, ui) {
                var task = ui.item;
                var taskId = task.attr('data-task-id');
                var taskPosition = task.attr('data-position');
                var taskColumnId = task.attr('data-column-id');
                var taskSwimlaneId = task.attr('data-swimlane-id');

                var newColumnId = task.parent().attr("data-column-id");
                var newSwimlaneId = task.parent().attr('data-swimlane-id');
                var newPosition = task.index() + 1;

                var boardId = task.closest("table").attr("data-project-id");
                var saveURL = task.closest("table").attr("data-save-url");

                task.removeClass("draggable-item-selected");

                if (newColumnId != taskColumnId || newSwimlaneId != taskSwimlaneId || newPosition != taskPosition) {
                    self.changeTaskState(taskId);
                    self.save(saveURL, boardId, taskId, taskColumnId, newColumnId, newPosition, newSwimlaneId);
                }
            },
            start: function(event, ui) {
                ui.item.addClass("draggable-item-selected");
                ui.placeholder.height(ui.item.height());
            }
        };

        if (isMobile.any) {
            $(".task-board-sort-handle").css("display", "inline");
            params.handle = ".task-board-sort-handle";
        }
        
        $(this).sortable(params);
    });
};

Kanboard.BoardDragAndDrop.prototype.changeTaskState = function(taskId) {
    var task = $("div[data-task-id=" + taskId + "]");
    task.addClass('task-board-saving-state');
    task.find('.task-board-saving-icon').show();
};

Kanboard.BoardDragAndDrop.prototype.save = function(saveURL, boardId, taskId, srcColumnId, dstColumnId, position, swimlaneId) {
    var self = this;
    self.app.showLoadingIcon();
    self.savingInProgress = true;

    $.ajax({
        cache: false,
        url: saveURL,
        contentType: "application/json",
        type: "POST",
        processData: false,
        data: JSON.stringify({
            "task_id": taskId,
            "src_column_id": srcColumnId,
            "dst_column_id": dstColumnId,
            "swimlane_id": swimlaneId,
            "position": position
        }),
        success: function(data) {
            self.refresh(boardId,data);
            self.savingInProgress = false;
        },
        error: function() {
            self.app.hideLoadingIcon();
            self.savingInProgress = false;
        },
        statusCode: {
            403: function(data) {
                window.alert(data.responseJSON.message);
                document.location.reload(true);
            }
        }
    });
};

Kanboard.BoardDragAndDrop.prototype.refresh = function(boardId, data) {

    $("div[id=board-container][data-project-id=" + boardId + "]").replaceWith(data);

    this.app.hideLoadingIcon();
    this.executeListeners();
    this.dragAndDrop();
};

Kanboard.BoardDragAndDrop.prototype.executeListeners = function() {
    for (var className in this.app.controllers) {
        var controller = this.app.get(className);

        if (typeof controller.onBoardRendered === "function") {
            controller.onBoardRendered();
        }
    }
};