summaryrefslogtreecommitdiff
path: root/plugins/Bigboard/Asset/js/BoardDragAndDrop.js
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Bigboard/Asset/js/BoardDragAndDrop.js')
-rw-r--r--plugins/Bigboard/Asset/js/BoardDragAndDrop.js124
1 files changed, 124 insertions, 0 deletions
diff --git a/plugins/Bigboard/Asset/js/BoardDragAndDrop.js b/plugins/Bigboard/Asset/js/BoardDragAndDrop.js
new file mode 100644
index 00000000..b6b7b8c3
--- /dev/null
+++ b/plugins/Bigboard/Asset/js/BoardDragAndDrop.js
@@ -0,0 +1,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();
+ }
+ }
+};