Fix ordering issues

This commit is contained in:
Julius Haertl
2016-10-28 10:42:21 +02:00
parent 025736124d
commit 077cb8ab3c
4 changed files with 490 additions and 414 deletions

View File

@@ -25,8 +25,8 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
$scope.sidebar = $rootScope.sidebar;
$scope.id = $stateParams.boardId;
$scope.status={},
$scope.newLabel={};
$scope.status = {},
$scope.newLabel = {};
$scope.status.boardtab = $stateParams.detailTab;
$scope.stackservice = StackService;
@@ -53,13 +53,13 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
console.log("statewatch" + name);
$scope.filter = name;
});
$scope.switchFilter = function(filter) {
$scope.switchFilter = function (filter) {
console.log("switch filter click " + name);
$state.go('.', {filter: filter}, {notify: false});
$scope.filter = filter;
};
$scope.$watch('filter', function(name) {
if(name==="archive") {
$scope.$watch('filter', function (name) {
if (name === "archive") {
$scope.loadArchived();
} else {
$scope.loadDefault();
@@ -69,18 +69,18 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
$scope.stacksData = StackService;
$scope.stacks = {};
$scope.$watch('stacksData', function(value) {
$scope.$watch('stacksData', function (value) {
$scope.refreshData();
}, true);
$scope.refreshData = function () {
if($scope.filter === "archive") {
if ($scope.filter === "archive") {
$scope.filterData('-lastModified', $scope.searchText);
} else {
$scope.filterData('order', $scope.searchText);
}
};
$scope.checkCanEdit = function() {
if($scope.archived) {
$scope.checkCanEdit = function () {
if ($scope.archived) {
return false;
}
return true;
@@ -88,9 +88,10 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
// filter cards here, as ng-sortable will not work nicely with html-inline filters
$scope.filterData = function (order, text) {
console.log("filter data");
if ($scope.stacks === undefined)
return;
angular.copy($scope.stackservice.data, $scope.stacks);
angular.copy(StackService.getAll(), $scope.stacks);
angular.forEach($scope.stacks, function (value, key) {
var cards = [];
cards = $filter('cardSearchFilter')(value.cards, text);
@@ -99,132 +100,139 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
});
};
$scope.loadDefault = function() {
$scope.loadDefault = function () {
console.log("Load default");
StackService.fetchAll($scope.id).then(function(data) {
StackService.fetchAll($scope.id).then(function (data) {
$scope.statusservice.releaseWaiting();
}, function(error) {
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
};
$scope.loadArchived = function() {
$scope.loadArchived = function () {
console.log("Load archived!");
StackService.fetchArchived($scope.id).then(function(data) {
StackService.fetchArchived($scope.id).then(function (data) {
$scope.statusservice.releaseWaiting();
}, function(error) {
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
};
// Handle initial Loading
BoardService.fetchOne($scope.id).then(function(data) {
BoardService.fetchOne($scope.id).then(function (data) {
$scope.statusservice.releaseWaiting();
}, function(error) {
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
BoardService.searchUsers('%25');
$scope.searchForUser = function(search) {
if(search=="") {
$scope.searchForUser = function (search) {
if (search == "") {
search = "%25";
}
BoardService.searchUsers(search);
}
$scope.newStack = { 'boardId': $scope.id};
$scope.newStack = {'boardId': $scope.id};
$scope.newCard = {};
// Create a new Stack
$scope.createStack = function () {
StackService.create($scope.newStack).then(function (data) {
$scope.newStack.title="";
$scope.newStack.title = "";
});
};
$scope.createCard = function(stack, title) {
$scope.createCard = function (stack, title) {
var newCard = {
'title': title,
'stackId': stack,
'type': 'plain',
};
CardService.create(newCard).then(function (data) {
// FIXME: called here reorders
$scope.stackservice.addCard(data);
$scope.newCard.title = "";
});
}
$scope.cardDelete = function(card) {
$scope.cardDelete = function (card) {
CardService.delete(card.id);
StackService.deleteCard(card);
}
$scope.cardArchive = function(card) {
$scope.cardArchive = function (card) {
CardService.archive(card);
StackService.deleteCard(card);
};
$scope.cardUnarchive = function(card){
$scope.cardUnarchive = function (card) {
CardService.unarchive(card);
StackService.deleteCard(card);
}
$scope.labelDelete = function(label) {
$scope.labelDelete = function (label) {
LabelService.delete(label.id);
// remove from board data
var i = BoardService.getCurrent().labels.indexOf(label);
BoardService.getCurrent().labels.splice(i, 1);
// TODO: remove from cards
}
$scope.labelCreate = function(label) {
$scope.labelCreate = function (label) {
label.boardId = $scope.id;
LabelService.create(label);
BoardService.getCurrent().labels.push(label);
$scope.status.createLabel = false;
$scope.newLabel = {};
}
$scope.labelUpdate = function(label) {
$scope.labelUpdate = function (label) {
label.edit = false;
LabelService.update(label);
console.log(label);
}
$scope.aclAdd = function(sharee) {
$scope.aclAdd = function (sharee) {
sharee.boardId = $scope.id;
BoardService.addAcl(sharee);
$scope.status.addSharee = null;
}
$scope.aclDelete = function(acl) {
$scope.aclDelete = function (acl) {
BoardService.deleteAcl(acl);
}
$scope.aclUpdate = function(acl) {
$scope.aclUpdate = function (acl) {
BoardService.updateAcl(acl);
}
// settings for card sorting
$scope.sortOptions = {
itemMoved: function (event) {
console.log('itemMoved');
// TODO: Implement reodering here (set new order of all cards in stack)
event.source.itemScope.modelValue.status = event.dest.sortableScope.$parent.column;
var order = event.dest.index;
var card = event.source.itemScope.c;
var newStack = event.dest.sortableScope.$parent.s.id;
var oldStack = card.stackId;
card.stackId = newStack;
CardService.update(card);
CardService.reorder(card, order).then(function(data) {
StackService.data[newStack].addCard(card);
CardService.reorder(card, order).then(function (data) {
StackService.addCard(card);
StackService.reorder(card, order);
StackService.deleteCard({
id: card.id,
stackId: oldStack
});
});
},
orderChanged: function (event) {
// TODO: Implement reordering here (set new order of all cards in stack)
// then maybe also call $scope.filterData('order')?
var order = event.dest.index;
var card = event.source.itemScope.c;
var stack = event.dest.sortableScope.$parent.s.id;
CardService.reorder(card, order);
CardService.reorder(card, order).then(function (data) {
StackService.reorder(card, order);
$scope.refreshData();
});
},
scrollableContainer: '#board',
containerPositioning: 'relative',

View File

@@ -119,8 +119,8 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat
$scope.sidebar = $rootScope.sidebar;
$scope.id = $stateParams.boardId;
$scope.status={},
$scope.newLabel={};
$scope.status = {},
$scope.newLabel = {};
$scope.status.boardtab = $stateParams.detailTab;
$scope.stackservice = StackService;
@@ -147,13 +147,13 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat
console.log("statewatch" + name);
$scope.filter = name;
});
$scope.switchFilter = function(filter) {
$scope.switchFilter = function (filter) {
console.log("switch filter click " + name);
$state.go('.', {filter: filter}, {notify: false});
$scope.filter = filter;
};
$scope.$watch('filter', function(name) {
if(name==="archive") {
$scope.$watch('filter', function (name) {
if (name === "archive") {
$scope.loadArchived();
} else {
$scope.loadDefault();
@@ -163,18 +163,18 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat
$scope.stacksData = StackService;
$scope.stacks = {};
$scope.$watch('stacksData', function(value) {
$scope.$watch('stacksData', function (value) {
$scope.refreshData();
}, true);
$scope.refreshData = function () {
if($scope.filter === "archive") {
if ($scope.filter === "archive") {
$scope.filterData('-lastModified', $scope.searchText);
} else {
$scope.filterData('order', $scope.searchText);
}
};
$scope.checkCanEdit = function() {
if($scope.archived) {
$scope.checkCanEdit = function () {
if ($scope.archived) {
return false;
}
return true;
@@ -182,9 +182,10 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat
// filter cards here, as ng-sortable will not work nicely with html-inline filters
$scope.filterData = function (order, text) {
console.log("filter data");
if ($scope.stacks === undefined)
return;
angular.copy($scope.stackservice.data, $scope.stacks);
angular.copy(StackService.getAll(), $scope.stacks);
angular.forEach($scope.stacks, function (value, key) {
var cards = [];
cards = $filter('cardSearchFilter')(value.cards, text);
@@ -193,132 +194,139 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat
});
};
$scope.loadDefault = function() {
$scope.loadDefault = function () {
console.log("Load default");
StackService.fetchAll($scope.id).then(function(data) {
StackService.fetchAll($scope.id).then(function (data) {
$scope.statusservice.releaseWaiting();
}, function(error) {
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
};
$scope.loadArchived = function() {
$scope.loadArchived = function () {
console.log("Load archived!");
StackService.fetchArchived($scope.id).then(function(data) {
StackService.fetchArchived($scope.id).then(function (data) {
$scope.statusservice.releaseWaiting();
}, function(error) {
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
};
// Handle initial Loading
BoardService.fetchOne($scope.id).then(function(data) {
BoardService.fetchOne($scope.id).then(function (data) {
$scope.statusservice.releaseWaiting();
}, function(error) {
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
BoardService.searchUsers('%25');
$scope.searchForUser = function(search) {
if(search=="") {
$scope.searchForUser = function (search) {
if (search == "") {
search = "%25";
}
BoardService.searchUsers(search);
}
$scope.newStack = { 'boardId': $scope.id};
$scope.newStack = {'boardId': $scope.id};
$scope.newCard = {};
// Create a new Stack
$scope.createStack = function () {
StackService.create($scope.newStack).then(function (data) {
$scope.newStack.title="";
$scope.newStack.title = "";
});
};
$scope.createCard = function(stack, title) {
$scope.createCard = function (stack, title) {
var newCard = {
'title': title,
'stackId': stack,
'type': 'plain',
};
CardService.create(newCard).then(function (data) {
// FIXME: called here reorders
$scope.stackservice.addCard(data);
$scope.newCard.title = "";
});
}
$scope.cardDelete = function(card) {
$scope.cardDelete = function (card) {
CardService.delete(card.id);
StackService.deleteCard(card);
}
$scope.cardArchive = function(card) {
$scope.cardArchive = function (card) {
CardService.archive(card);
StackService.deleteCard(card);
};
$scope.cardUnarchive = function(card){
$scope.cardUnarchive = function (card) {
CardService.unarchive(card);
StackService.deleteCard(card);
}
$scope.labelDelete = function(label) {
$scope.labelDelete = function (label) {
LabelService.delete(label.id);
// remove from board data
var i = BoardService.getCurrent().labels.indexOf(label);
BoardService.getCurrent().labels.splice(i, 1);
// TODO: remove from cards
}
$scope.labelCreate = function(label) {
$scope.labelCreate = function (label) {
label.boardId = $scope.id;
LabelService.create(label);
BoardService.getCurrent().labels.push(label);
$scope.status.createLabel = false;
$scope.newLabel = {};
}
$scope.labelUpdate = function(label) {
$scope.labelUpdate = function (label) {
label.edit = false;
LabelService.update(label);
console.log(label);
}
$scope.aclAdd = function(sharee) {
$scope.aclAdd = function (sharee) {
sharee.boardId = $scope.id;
BoardService.addAcl(sharee);
$scope.status.addSharee = null;
}
$scope.aclDelete = function(acl) {
$scope.aclDelete = function (acl) {
BoardService.deleteAcl(acl);
}
$scope.aclUpdate = function(acl) {
$scope.aclUpdate = function (acl) {
BoardService.updateAcl(acl);
}
// settings for card sorting
$scope.sortOptions = {
itemMoved: function (event) {
console.log('itemMoved');
// TODO: Implement reodering here (set new order of all cards in stack)
event.source.itemScope.modelValue.status = event.dest.sortableScope.$parent.column;
var order = event.dest.index;
var card = event.source.itemScope.c;
var newStack = event.dest.sortableScope.$parent.s.id;
var oldStack = card.stackId;
card.stackId = newStack;
CardService.update(card);
CardService.reorder(card, order).then(function(data) {
StackService.data[newStack].addCard(card);
CardService.reorder(card, order).then(function (data) {
StackService.addCard(card);
StackService.reorder(card, order);
StackService.deleteCard({
id: card.id,
stackId: oldStack
});
});
},
orderChanged: function (event) {
// TODO: Implement reordering here (set new order of all cards in stack)
// then maybe also call $scope.filterData('order')?
var order = event.dest.index;
var card = event.source.itemScope.c;
var stack = event.dest.sortableScope.$parent.s.id;
CardService.reorder(card, order);
CardService.reorder(card, order).then(function (data) {
StackService.reorder(card, order);
$scope.refreshData();
});
},
scrollableContainer: '#board',
containerPositioning: 'relative',
@@ -387,8 +395,10 @@ app.controller('CardController', ["$scope", "$rootScope", "$routeParams", "$loca
});
};
$scope.cardUpdate = function(card) {
CardService.update(CardService.getCurrent());
CardService.update(CardService.getCurrent()).then(function(data) {
$scope.status.cardEditDescription = false;
$('#card-description .save-indicator').fadeIn(500).fadeOut(1000);
});
}
$scope.labelAssign = function(element, model) {
@@ -1024,7 +1034,6 @@ app.factory('CardService', ["ApiService", "$http", "$q", function(ApiService, $h
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/reorder', {cardId: card.id, order: order, stackId: card.stackId}).then(function (response) {
card.order = order;
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
@@ -1135,8 +1144,38 @@ app.factory('StackService', ["ApiService", "$http", "$q", function(ApiService, $
};
StackService.prototype.addCard = function(entity) {
console.log(this.data);
if(!this.data[entity.stackId].cards) {
this.data[entity.stackId].cards = [];
}
this.data[entity.stackId].cards.push(entity);
console.log(this.data);
};
StackService.prototype.reorder = function(entity, order) {
// assign new order
for(var i=0, j=0;i<this.data[entity.stackId].cards.length;i++) {
if(this.data[entity.stackId].cards[i].id === entity.id) {
console.log(this.data[entity.stackId].cards[i].title + " " + order);
this.data[entity.stackId].cards[i].order = order;
}
if(j === order) {
j++;
}
if(this.data[entity.stackId].cards[i].id !== entity.id) {
this.data[entity.stackId].cards[i].order = j++;
}
}
// sort array by order
this.data[entity.stackId].cards.sort(function(a,b) {
if (a.order < b.order)
return -1;
if (a.order > b.order)
return 1;
return 0;
});
};
StackService.prototype.updateCard = function(entity) {
var self = this;
var cards = this.data[entity.stackId].cards;

View File

@@ -30,7 +30,6 @@ app.factory('CardService', function(ApiService, $http, $q){
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/reorder', {cardId: card.id, order: order, stackId: card.stackId}).then(function (response) {
card.order = order;
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);

View File

@@ -53,8 +53,38 @@ app.factory('StackService', function(ApiService, $http, $q){
};
StackService.prototype.addCard = function(entity) {
console.log(this.data);
if(!this.data[entity.stackId].cards) {
this.data[entity.stackId].cards = [];
}
this.data[entity.stackId].cards.push(entity);
console.log(this.data);
};
StackService.prototype.reorder = function(entity, order) {
// assign new order
for(var i=0, j=0;i<this.data[entity.stackId].cards.length;i++) {
if(this.data[entity.stackId].cards[i].id === entity.id) {
console.log(this.data[entity.stackId].cards[i].title + " " + order);
this.data[entity.stackId].cards[i].order = order;
}
if(j === order) {
j++;
}
if(this.data[entity.stackId].cards[i].id !== entity.id) {
this.data[entity.stackId].cards[i].order = j++;
}
}
// sort array by order
this.data[entity.stackId].cards.sort(function(a,b) {
if (a.order < b.order)
return -1;
if (a.order > b.order)
return 1;
return 0;
});
};
StackService.prototype.updateCard = function(entity) {
var self = this;
var cards = this.data[entity.stackId].cards;