This repository has been archived on 2021-08-17. You can view files and clone it, but cannot push or open issues or pull requests.

249 lines
8.5 KiB
JavaScript

taskBoardControllers.controller('BoardCtrl',
['$scope', '$routeParams', '$location', '$interval', '$window',
'UserService', 'BoardService', 'AlertService', 'AuthenticationService',
function ($scope, $routeParams, $location, $interval, $window,
UserService, BoardService, AlertService, AuthenticationService) {
// This is here because the BoardCtrl is the default redirect from login.
// If the user was trying to go somewhere else first, they are redirected now.
if (AuthenticationService.attemptedRoute) {
var tmp = AuthenticationService.attemptedRoute,
path = tmp.originalPath;
tmp.keys.forEach(function(key) {
path = path.replace(':' + key.name, tmp.params[key.name]);
});
AuthenticationService.attemptedRoute = null;
$location.path(path);
}
$scope.alerts = AlertService;
$scope.marked = function(text) {
if (text) {
return $window.marked(text);
} else {
return "<p>No Description</p>";
}
};
$scope.boardId = $routeParams.boardId;
$scope.filter = {
user: null,
category: null
};
$scope.filterChanged = function() {
$scope.currentBoard.ownLane.forEach(function (lane) {
if (lane.ownItem) {
lane.ownItem.forEach(function (item) {
item.filtered = false;
if ($scope.filter.user !== null) {
if ($scope.filter.user != item.assignee) {
item.filtered = true;
}
}
if ($scope.filter.category !== null) {
if ($scope.filter.category != item.category) {
item.filtered = true;
}
}
});
}
});
};
$scope.selectBoard = function() {
$location.path('boards/' + $scope.boardNames.current);
};
$scope.openEditItem = function() {
$scope.itemFormData.loadItem($scope.contextItem);
$('.itemModal').modal('show');
};
$scope.openAddItem = function() {
$scope.itemFormData.reset($scope.contextLaneId);
$('.itemModal').modal('show');
};
$scope.removeItem = function() {
$scope.openItem($scope.contextItem, false);
$scope.deleteItem();
};
$scope.contextItem = {}; // Needs to exist prior to onContextMenu call.
$scope.onContextMenu = function(laneId, item) {
$scope.contextItem = item;
$scope.contextLaneId = laneId;
};
// This is called every 250ms until the boards are loaded.
// Once loaded, the repetitive calling is canceled.
// If a default is found the user is redirected to that board.
var checkDefaultBoard = function() {
if ($scope.boardId) {
$interval.cancel($scope.interval);
}
if ($scope.boardsLoaded && !$scope.boardId && parseInt($scope.currentUser.defaultBoard)) {
$interval.cancel($scope.interval);
$location.path('boards/' + $scope.currentUser.defaultBoard);
}
};
$scope.interval = $interval(checkDefaultBoard, 250);
$scope.$on('$destroy', function () { $interval.cancel($scope.interval); });
$scope.boards = [];
$scope.boardsLoaded = false;
$scope.boardNames = [];
$scope.userNames = [];
$scope.laneNames = [];
$scope.categories = [];
$scope.currentBoard = {
loading: true,
name: 'Kanban Board App'
};
var pendingResponse = false,
updateCounter = 0;
$scope.loadBoards = function() {
// Don't update the boards if an update is pending.
if (pendingResponse || updateCounter) {
return;
}
pendingResponse = true;
BoardService.getBoards()
.success(function(data) {
pendingResponse = false;
$scope.updateBoards(data);
});
};
$scope.loadBoards();
$scope.boardInterval = $interval($scope.loadBoards, 10000);
$scope.$on('$destroy', function () { $interval.cancel($scope.boardInterval); });
$scope.updateBoards = function(data) {
// Don't update the boards if a position update is pending.
if (0 !== updateCounter) {
return;
}
$scope.boards = data.data;
$scope.boardsLoaded = true;
var boardFound = false;
if ($scope.boards) {
$scope.boardNames = [];
$scope.boards.forEach(function(board) {
// Add each board's name to the list.
$scope.boardNames.push({id: board.id, name: board.name});
// If the board is the current board, process and assign it.
if (board.id == $scope.boardId) {
board.sharedUser.unshift({ id: 0, username: 'Unassigned' });
board.sharedUser.forEach(function(user) {
$scope.userNames[user.id] = user.username;
});
board.ownLane.forEach(function(lane) {
$scope.laneNames[lane.id] = lane.name;
if (lane.ownItem) {
lane.ownItem.forEach(function(item) {
var date = new Date(item.due_date),
diff = date - Date.now();
if (diff < 0) {
item.datePast = true;
} else if (diff < (1000 * 60 * 60 * 24 * 3)) { // Three days
item.dateNear = true;
}
});
}
});
if (board.ownCategory) {
board.ownCategory.unshift({ id: 0, name: 'Uncategorized' });
board.ownCategory.forEach(function(category) {
$scope.categories[category.id] = category.name;
});
}
$scope.currentBoard = board;
$scope.boardNames.current = board.id;
boardFound = true;
}
});
}
if (boardFound) {
$scope.filterChanged(); // Make sure any filters are still applied.
$scope.currentBoard.loading = false;
} else {
$scope.currentBoard.error = true;
}
};
$scope.toggleLane = function(lane) {
lane.collapsed = !lane.collapsed;
updateCounter++;
BoardService.toggleLane(lane.id)
.success(function(data) {
updateCounter--;
$scope.updateBoards(data);
});
};
// This is not the Angular way.
$scope.updateSortables = function() {
var that = this.$parent;
$('.itemContainer').sortable({
connectWith: '.itemContainer',
placeholder: 'draggable-placeholder',
items: 'div:not(.addItem, .itemHeader, .description)',
change: function(event, ui) {
var parent = $(ui).parent(),
addItem = parent.find('.addItem');
addItem.detach();
parent.append(addItem);
},
stop: function(event, ui) {
var lanes = $.find('.boardColumn'),
positionArray = [];
$(lanes).each(function() {
var laneId = $(this).attr('data-lane-id');
$(this).find('.boardItem').each(function(index) {
var itemId = $(this).attr('data-item-id');
positionArray.push({
item: itemId,
lane: laneId,
position: index
});
});
});
that.updatePositions(positionArray);
}
});
};
$scope.updatePositions = function(positionArray) {
updateCounter++;
BoardService.updateItemPositions(positionArray)
.success(function(data) {
updateCounter--;
$scope.updateBoards(data);
});
};
$scope.currentUser = {};
$scope.userLoaded = false;
$scope.updateCurrentUser = function() {
UserService.currentUser()
.success(function(data) {
$scope.userLoaded = true;
$scope.currentUser = data.data;
});
};
$scope.updateCurrentUser();
}]);