experimental-accounting-api/accounting/static/js/accounting.js
2013-12-20 15:04:37 +01:00

152 lines
3.9 KiB
JavaScript

'use strict';
// Part of the accounting-api project:
// https://gitorious.org/conservancy/accounting-api
// License: AGPLv3-or-later
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
};
function guid() {
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
}
function Transaction(args) {
var self = this;
this.__type__ = 'Transaction';
this.id = null;
this.payee = null;
this.date = null;
this.postings = null;
this.metadata = {};
this.generateId = function () {
self.id = guid();
}
for (var i in args) {
this[i] = args[i];
}
}
function Posting(args) {
this.__type__ = 'Posting';
this.account = null;
this.amount = null;
for (var i in args) {
this[i] = args[i];
}
}
function Amount(args) {
this.__type__ = 'Amount';
this.symbol = null;
this.amount = null;
for (var i in args) {
this[i] = args[i];
}
}
var models = {
'Amount': Amount,
'Posting': Posting,
'Transaction': Transaction
};
function accountingObjectHook(object) {
if ('__type__' in object) {
console.log('Found typed object: ', object.__type__, object);
var model = new models[object.__type__];
for (var i in object) {
model[i] = object[i];
}
return model;
}
return object;
}
function transformResponseFactory(object_hook) {
var self = this;
self.object_hook = object_hook;
function transformResponse(json, headers) {
var transformed;
console.log('json: ', json);
if (typeof json == 'undefined') {
return;
} else if ((typeof json == 'object') &&
Object.prototype.toString.call(json) == '[object Object]') {
console.log('json is Object, json: ', json);
for (var i in json) {
json[i] = transformResponse(json[i]);
}
transformed = self.object_hook(json)
} else if ((typeof json == 'object') &&
Object.prototype.toString.call(json) == '[object Array]') {
console.log('json is Array, json: ', json);
for (var i in json) {
json[i] = transformResponse(json[i]);
}
transformed = json;
} else {
transformed = json;
}
return transformed;
};
return transformResponse;
}
function transformRequestFactory(object_hook) {
function transformRequest(data, headerSetter) {
console.log('transformRequest', data, headerSetter)
headerSetter()['Content-Type'] = 'application/json';
return data;
}
return transformRequest;
}
angular.module('accountingApi', ['ngResource'])
.factory('Transaction', function () {
return Transaction;
})
.factory('Posting', function () {
return Posting;
})
.factory('Amount', function () {
return Amount;
})
.factory('AccountingApi', function($resource, $http) {
$http.defaults.useXDomain = true;
$http.defaults.transformResponse.push(new transformResponseFactory(
accountingObjectHook));
var AccountingApi = $resource(
'/transaction/:id',
{},
{
get: {
method: 'GET',
transformResponse: Array.prototype.concat(
$http.defaults.transformResponse,
[function (data){
if (typeof data == 'object' &&
'transaction' in data) {
return data.transaction;
}
return data;
}]
)
},
save: {
method: 'POST',
transformRequest: [new transformRequestFactory()].concat(
$http.defaults.transformRequest)
}
}
);
return AccountingApi;
});