refactoring and stack undo delete early wip

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack soft delete done

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack undo delete done

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack undo: code review remarks and fixes

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
This commit is contained in:
Manuel Arno Korfmann
2018-07-16 00:09:43 +02:00
committed by Julius Härtl
parent f2795f120b
commit ef4ce31c47
13 changed files with 164 additions and 118 deletions

View File

@@ -4,20 +4,20 @@
* @author Julius Härtl <jus@bitgrid.net>
*
* @license GNU AGPL version 3 or any later version
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
import app from '../app/App.js';
@@ -42,7 +42,17 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
$scope.board = BoardService.getCurrent();
$scope.uploader = FileService.uploader;
$scope.deletedCards = [];
$scope.deletedCards = {};
$scope.deletedStacks = {};
$scope.$watch(function() {
return $state.current;
}, function(currentState) {
if(currentState.name === 'board.detail') {
$scope.loadDeletedEntity(CardService, 'deletedCards');
$scope.loadDeletedEntity(StackService, 'deletedStacks');
}
});
// workaround for $stateParams changes not being propagated
$scope.$watch(function() {
@@ -138,9 +148,11 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
});
};
$scope.loadDeletedCards = function() {
CardService.fetchDeleted($scope.id).then(function (data) {
$scope.deletedCards = data;
$scope.loadDeletedEntity = function(service, scopeKey) {
service.fetchDeleted($scope.id).then(function (data) {
for(i=0;i<data.length;i++) {
$scope[scopeKey][data[i].id] = data[i];
}
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
@@ -196,30 +208,30 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
});
};
$scope.stackDelete = function (stack) {
$scope.stackservice.delete(stack.id).then(function() {
$scope.deletedStacks[stack.id] = stack;
});
}
$scope.stackUndoDelete = function (deletedStack) {
StackService.undoDelete(deletedStack).then(function() {
delete $scope.deletedStacks[deletedStack.id];
});
}
$scope.cardDelete = function (card) {
OC.dialogs.confirm(t('deck', 'Are you sure you want to delete this card with all of its data?'), t('deck', 'Delete'), function(state) {
if (!state) {
return;
}
CardService.delete(card.id).then(function () {
StackService.removeCard(card);
$scope.deletedCards.push(card);
});
CardService.delete(card.id).then(function () {
StackService.removeCard(card);
$scope.deletedCards[card.id] = card;
});
};
$scope.cardUndoDelete = function (deletedCard) {
CardService.undoDelete(deletedCard);
StackService.addCard(deletedCard);
$scope.removeFromDeletedCards(deletedCard);
};
$scope.removeFromDeletedCards = function(deletedCard) {
for(var i=0;i<$scope.deletedCards.length;i++) {
if($scope.deletedCards[i].id === deletedCard.id) {
$scope.deletedCards.splice(i, 1);
}
}
CardService.undoDelete(deletedCard).then(function() {
StackService.addCard(deletedCard);
delete $scope.deletedCards[deletedCard.id];
});
};
$scope.cardArchive = function (card) {
@@ -262,7 +274,6 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
// TODO: remove from cards
};
$scope.labelCreate = function (label) {
alert(label);
label.boardId = $scope.id;
LabelService.create(label).then(function (data) {
$scope.newStack.title = '';
@@ -410,6 +421,4 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
}
return card.attachmentCount;
};
$scope.loadDeletedCards();
});

View File

@@ -4,20 +4,20 @@
* @author Julius Härtl <jus@bitgrid.net>
*
* @license GNU AGPL version 3 or any later version
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
import app from '../app/App.js';
@@ -48,6 +48,19 @@ app.factory('ApiService', function ($http, $q) {
return deferred.promise;
};
ApiService.prototype.fetchDeleted = function (scopeId) {
var deferred = $q.defer();
var self = this;
$http.get(this.baseUrl + '/deleted/' + scopeId).then(function (response) {
var objects = response.data;
deferred.resolve(objects);
}, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed');
});
return deferred.promise;
};
ApiService.prototype.fetchOne = function (id) {
this.id = id;
@@ -111,20 +124,19 @@ app.factory('ApiService', function ($http, $q) {
deferred.reject('Deleting ' + self.endpoint + ' failed');
});
return deferred.promise;
};
ApiService.prototype.softDelete = function (id) {
var deferred = $q.defer();
ApiService.prototype.undoDelete = function(entity) {
var self = this;
$http.delete(this.baseUrl + '/' + id).then(function (response) {
self.data[id].deletedAt = response.data.deletedAt;
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Deleting ' + self.endpoint + ' failed');
entity.deletedAt = 0;
var promise = this.update(entity);
promise.then(function() {
self.data[entity.id] = entity;
});
return deferred.promise;
return promise;
};
// methods for managing data

View File

@@ -4,20 +4,20 @@
* @author Julius Härtl <jus@bitgrid.net>
*
* @license GNU AGPL version 3 or any later version
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
import app from '../app/App.js';
@@ -27,13 +27,6 @@ app.factory('CardService', function (ApiService, $http, $q) {
};
CardService.prototype = angular.copy(ApiService.prototype);
CardService.prototype.delete = CardService.prototype.softDelete;
CardService.prototype.undoDelete = function(card) {
card.deletedAt = 0;
this.update(card);
};
CardService.prototype.reorder = function (card, order) {
var deferred = $q.defer();
var self = this;
@@ -179,19 +172,6 @@ app.factory('CardService', function (ApiService, $http, $q) {
return deferred.promise;
};
CardService.prototype.fetchDeleted = function (boardId) {
var deferred = $q.defer();
var self = this;
$http.get(this.baseUrl + '/deleted/' + boardId).then(function (response) {
var objects = response.data;
deferred.resolve(objects);
}, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed');
});
return deferred.promise;
};
var service = new CardService($http, 'cards', $q);
return service;
});

View File

@@ -4,20 +4,20 @@
* @author Julius Härtl <jus@bitgrid.net>
*
* @license GNU AGPL version 3 or any later version
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
import app from '../app/App.js';
@@ -27,6 +27,7 @@ app.factory('StackService', function (ApiService, CardService, $http, $q) {
ApiService.call(this, $http, ep, $q);
};
StackService.prototype = angular.copy(ApiService.prototype);
StackService.prototype.fetchAll = function (boardId) {
var deferred = $q.defer();
var self = this;
@@ -129,27 +130,6 @@ app.factory('StackService', function (ApiService, CardService, $http, $q) {
}
};
// FIXME: Should not show popup but proper undo mechanism
StackService.prototype.delete = function (id) {
var deferred = $q.defer();
var self = this;
OC.dialogs.confirm(t('deck', 'Are you sure you want to delete the stack with all of its data?'), t('deck', 'Delete'), function(state) {
if (!state) {
return;
}
$http.delete(self.baseUrl + '/' + id).then(function (response) {
self.remove(id);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Deleting ' + self.endpoint + ' failed');
});
});
return deferred.promise;
};
var service = new StackService($http, 'stacks', $q);
return service;
});