191 lines
5.9 KiB
JavaScript
191 lines
5.9 KiB
JavaScript
|
/*
|
||
|
This file is part of Accountant.
|
||
|
|
||
|
Accountant 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.
|
||
|
|
||
|
Foobar 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 Accountant. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
// Util function to show a message in message placeholder.
|
||
|
function message(alertType, title, message) {
|
||
|
$(".alert").alert('close');
|
||
|
$("#message-placeholder").append('<div class="alert alert-' + alertType + '"><button type="button" class="close" data-dismiss="alert">×</button><h4>' + title + '</h4>' + message + '</div>');
|
||
|
}
|
||
|
|
||
|
var SchedulerController = function($scope, $http, $rootScope, $filter) {
|
||
|
// Operations store and selection
|
||
|
$scope.operations = [];
|
||
|
$scope.selectedOperation = null;
|
||
|
|
||
|
$scope.account = null;
|
||
|
|
||
|
// Placeholder for saved value to cancel entry edition
|
||
|
$scope.savedOperation = null;
|
||
|
|
||
|
$scope.loadOperations = function(account) {
|
||
|
// Clean up selected entry.
|
||
|
$scope.selectedOperation = null;
|
||
|
$scope.savedOperation = null;
|
||
|
|
||
|
if(account) {
|
||
|
$scope.account = account;
|
||
|
|
||
|
$http.get("/api/scheduled_operations/" + account.id).success($scope.loadOperations_success);
|
||
|
} else {
|
||
|
$scope.loadOperations_success(null);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$scope.loadOperations_success = function(data) {
|
||
|
var operations = [{
|
||
|
id: null,
|
||
|
start_date: null,
|
||
|
stop_date: null,
|
||
|
day: null,
|
||
|
frequency: null,
|
||
|
label: null,
|
||
|
account_id: null,
|
||
|
category: null,
|
||
|
state: "edit"
|
||
|
}];
|
||
|
|
||
|
if(data) {
|
||
|
operations = operations.concat(angular.fromJson(data));
|
||
|
}
|
||
|
|
||
|
$scope.operations = operations;
|
||
|
|
||
|
$scope.$emit("operationsLoadedEvent", {operations: operations});
|
||
|
};
|
||
|
|
||
|
$scope.iconSaveClass = function(operation) {
|
||
|
if($scope.isNew(operation)) {
|
||
|
return "icon-plus";
|
||
|
} else if ($scope.isEditing(operation)) {
|
||
|
return "icon-ok";
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$scope.iconCancelClass = function(operation) {
|
||
|
if($scope.isNew(operation)) {
|
||
|
return "icon-remove";
|
||
|
} else if ($scope.isEditing(operation)) {
|
||
|
return "icon-ban-circle";
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$scope.isNew = function(operation) {
|
||
|
return !operation.id;
|
||
|
};
|
||
|
|
||
|
// Returns true if the entry is in editing state.
|
||
|
$scope.isEditing = function(operation) {
|
||
|
return operation.state === 'edit';
|
||
|
};
|
||
|
|
||
|
$scope.isDisplaying = function(operation) {
|
||
|
return operation.id && (!operation.state || operation.state === 'display');
|
||
|
};
|
||
|
|
||
|
$scope.saveOperation = function(operation) {
|
||
|
if(!operation.account_id) {
|
||
|
operation.account_id = $scope.account.id;
|
||
|
}
|
||
|
|
||
|
// prepare the Ajax xall to save the sceduled operation.
|
||
|
var type;
|
||
|
var url = "/api/scheduled_operations";
|
||
|
|
||
|
if(!$scope.isNew(operation)) {
|
||
|
url += "/" + operation.id;
|
||
|
}
|
||
|
|
||
|
$http.put(url, angular.toJson(operation)).success(function(data) {
|
||
|
message("success", "Save", data);
|
||
|
$scope.$emit("operationSavedEvent", operation);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
$scope.editOperation = function(operation) {
|
||
|
// Cancel previous editing.
|
||
|
if($scope.selectedOperation) {
|
||
|
$scope.cancelEditOperation($scope.selectedItem);
|
||
|
}
|
||
|
|
||
|
// Save current entry values.
|
||
|
$scope.savedOperation = angular.copy(operation);
|
||
|
$scope.selectedOperation = operation;
|
||
|
|
||
|
// Enter edit state.
|
||
|
operation.state='edit';
|
||
|
};
|
||
|
|
||
|
$scope.cancelEditOperation = function(operation) {
|
||
|
if ($scope.isNew(operation)) {
|
||
|
operation.id = null;
|
||
|
operation.start_date = null;
|
||
|
operation.stop_date = null;
|
||
|
operation.day = null;
|
||
|
operation.frequency = null;
|
||
|
operation.label = null;
|
||
|
operation.value = null;
|
||
|
operation.category = null;
|
||
|
operation.account_id = $scope.account.id;
|
||
|
} else if ($scope.isEditing(operation)) {
|
||
|
if($scope.savedOperation) {
|
||
|
operation.id = $scope.savedOperation.id;
|
||
|
operation.start_date = $scope.savedOperation.start_date;
|
||
|
operation.stop_date = $scope.savedOperation.stop_date;
|
||
|
operation.day = $scope.savedOperation.day;
|
||
|
operation.frequency = $scope.savedOperation.frequency;
|
||
|
operation.label = $scope.savedOperation.label;
|
||
|
operation.value = $scope.savedOperation.value;
|
||
|
operation.category = $scope.savedOperation.category;
|
||
|
operation.account_id = $scope.savedOperation.account_id;
|
||
|
}
|
||
|
|
||
|
$scope.savedOperation = null;
|
||
|
$scope.selectedOperation = null;
|
||
|
|
||
|
operation.state = 'display';
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$scope.removeOperation = function(operation, modalScope) {
|
||
|
// Cancel current editing.
|
||
|
if (!$scope.isNew(operation)) {
|
||
|
$http.delete("/api/scheduled_operations/" + operation.id).success(function (result) {
|
||
|
message("success", "Delete", result);
|
||
|
|
||
|
// Send the "entry removed" event.
|
||
|
$scope.$emit("operationRemovedEvent", operation);
|
||
|
|
||
|
$scope.closeModal(modalScope);
|
||
|
}).error(function (data) {
|
||
|
message("error", "Delete", data);
|
||
|
|
||
|
$scope.closeModal(modalScope);
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$scope.closeModal = function(modalScope) {
|
||
|
// Close the modal dialog
|
||
|
if(modalScope && modalScope.dismiss) {
|
||
|
modalScope.dismiss();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$rootScope.$on("accountsLoadedEvent", function(event, args){
|
||
|
$scope.loadOperations(args.account);
|
||
|
});
|
||
|
}
|