393 lines
8.7 KiB
JavaScript
393 lines
8.7 KiB
JavaScript
function GroupList() {
|
|
|
|
lastChange=0;
|
|
|
|
this.loadFromLocalStorage=function() {
|
|
if (jQuery.type(localStorage.groups)!='undefined') {
|
|
try {
|
|
var data=JSON.parse(localStorage.groups);
|
|
this.lastChange=data.lastChange;
|
|
for (el in data.groups) {
|
|
this[el]=new Group(el,false,data.groups[el]);
|
|
}
|
|
}
|
|
catch(e) {
|
|
for (el in this) {
|
|
if (this.isGroup(this[el])) {
|
|
delete this[el];
|
|
}
|
|
}
|
|
myconfirm('Erreur en chargeant les données locales. On les purges ?',
|
|
function(data) {
|
|
delete localStorage.groups;
|
|
location.reload();
|
|
}
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.export=function() {
|
|
return this.each(function(idx,group) {
|
|
return group.export();
|
|
});
|
|
}
|
|
|
|
this.import=function(groups) {
|
|
ret={};
|
|
for (el in this) {
|
|
if (this.isGroup(this[el])) {
|
|
delete ret[el];
|
|
}
|
|
}
|
|
for (el in groups) {
|
|
this[el]=new Group(el,false,groups[el]);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
this.save=function() {
|
|
localStorage.groups=JSON.stringify({
|
|
'lastChange': new Date().getTime(),
|
|
'groups': this.export()
|
|
});
|
|
}
|
|
|
|
this.each=function(fct) {
|
|
var idx=0;
|
|
var ret={};
|
|
for (el in this) {
|
|
if(this.isGroup(this[el])) {
|
|
ret[el]=fct(idx++,this[el]);
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
this.count=function() {
|
|
len=0;
|
|
this.each(function(idx,group) {
|
|
len=len+1;
|
|
});
|
|
return len;
|
|
}
|
|
|
|
this.isGroup=function(el) {
|
|
return (jQuery.type(el)=='object' && jQuery.type(el.isGroup)=='function' && el.isGroup());
|
|
}
|
|
|
|
this.byName=function(name) {
|
|
for (el in this) {
|
|
if(this.isGroup(this[el])) {
|
|
if (this[el].name==name) {
|
|
return this[el];
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
this.removeGroup=function(uuid) {
|
|
if (this.isGroup(this[uuid])) {
|
|
delete this[uuid];
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
this.balances=function(fct) {
|
|
return this.each(function(idx,group) {
|
|
bal=group.balance();
|
|
bal.name=group.name;
|
|
return bal;
|
|
});
|
|
}
|
|
|
|
this.newGroup=function(name,uuid) {
|
|
var uuid=uuid||generate_uuid();
|
|
this[uuid]=new Group(uuid,name);
|
|
return uuid;
|
|
}
|
|
|
|
}
|
|
|
|
function Group(uuid,name,data) {
|
|
this.uuid=uuid || generate_uuid();
|
|
this.name=name || false;
|
|
this.contributors=[];
|
|
this.contributions={};
|
|
this.deletedContributions={};
|
|
|
|
|
|
this.isGroup=function() {
|
|
return true;
|
|
}
|
|
|
|
this.export=function() {
|
|
var contributors=[];
|
|
for (idx in this.contributors) {
|
|
contributors.push(this.contributors[idx].export());
|
|
}
|
|
var contributions={}
|
|
for (uuid in this.contributions) {
|
|
contributions[uuid]=this.contributions[uuid].export();
|
|
}
|
|
return {
|
|
'uuid': this.uuid,
|
|
'name': encodeURIComponent(this.name),
|
|
'contributors': contributors,
|
|
'contributions': contributions,
|
|
'deletedContributions': this.deletedContributions
|
|
};
|
|
}
|
|
|
|
/*
|
|
* Contributors
|
|
*/
|
|
this.removeContributor=function(c) {
|
|
this.contributors=this.contributors.filter(function(v){
|
|
return (v.name!=c);
|
|
});
|
|
}
|
|
|
|
this.contributorByName=function(name) {
|
|
for (c in this.contributors) {
|
|
if (this.contributors[c].name == name) return this.contributors[c];
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
this.contributorByEmail=function(email) {
|
|
for (c in this.contributors) {
|
|
if (this.contributors[c].email == email) return this.contributors[c];
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
this.addContributor=function(c) {
|
|
c.id=this.contributors.length;
|
|
this.contributors.push(c);
|
|
}
|
|
|
|
this.replaceContributor=function(idx,c) {
|
|
c.id=idx;
|
|
this.contributors[idx]=c;
|
|
}
|
|
|
|
/*
|
|
* Contributions
|
|
*/
|
|
this.contributionsByContributorName=function(name) {
|
|
var ret={};
|
|
for (uuid in this.contributions) {
|
|
if (this.contributions[uuid].contributor.name==name) {
|
|
ret[uuid]=this.contributions[uuid];
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
this.addContribution=function(c) {
|
|
this.contributions[c.uuid]=c;
|
|
}
|
|
|
|
this.updateContribution=function(uuid,c) {
|
|
c.uuid=uuid;
|
|
this.contributions[uuid]=c;
|
|
}
|
|
|
|
this.deleteContribution=function(uuid) {
|
|
this.contributions[uuid].lastChange=new Date().getTime();
|
|
this.deletedContributions[uuid]=this.contributions[uuid].export();
|
|
delete this.contributions[uuid];
|
|
}
|
|
|
|
|
|
/*
|
|
* Balance
|
|
*/
|
|
this.balance=function() {
|
|
total={}
|
|
min=-1;
|
|
max=0;
|
|
for (idx in this.contributors) {
|
|
var sum=0;
|
|
c=this.contributors[idx].name;
|
|
cl=this.contributionsByContributorName(c);
|
|
for (uuid in cl) {
|
|
sum+=cl[uuid].cost;
|
|
}
|
|
if (min==-1 || min>sum) {
|
|
min=sum;
|
|
}
|
|
if(max<sum) {
|
|
max=sum;
|
|
}
|
|
total[c]=sum;
|
|
}
|
|
balance={}
|
|
var sum=0;
|
|
for (c in total) {
|
|
balance[c]={
|
|
'total': total[c],
|
|
'diff': total[c]-max,
|
|
}
|
|
sum=sum+total[c];
|
|
}
|
|
return {
|
|
'balance': balance,
|
|
'sum': sum,
|
|
'min': min,
|
|
'max': max
|
|
};
|
|
}
|
|
|
|
/*
|
|
* Contructor
|
|
*/
|
|
if (jQuery.type(data)=='object') {
|
|
try {
|
|
this.uuid=data.uuid;
|
|
this.name=data.name;
|
|
if (jQuery.type(data.contributors) == 'array') {
|
|
for (idx in data.contributors) {
|
|
this.contributors.push(new Contributor(
|
|
decodeURIComponent(data.contributors[idx].name),
|
|
decodeURIComponent(data.contributors[idx].email),
|
|
idx
|
|
));
|
|
}
|
|
}
|
|
if (jQuery.type(data.contributions) == 'object') {
|
|
for (uuid in data.contributions) {
|
|
this.contributions[uuid]=new Contribution(
|
|
this.contributorByName(data.contributions[uuid].contributor),
|
|
data.contributions[uuid].cost,
|
|
decodeURIComponent(data.contributions[uuid].title),
|
|
data.contributions[uuid].date,
|
|
uuid,
|
|
data.contributions[uuid].lastChange
|
|
);
|
|
}
|
|
}
|
|
if (jQuery.type(data.deletedContributions) == 'object') {
|
|
for (uuid in data.deletedContributions) {
|
|
this.deletedContributions[uuid]=data.deletedContributions[uuid];
|
|
}
|
|
}
|
|
}
|
|
catch (e) {
|
|
alert('Une erreur est survenue en chargeant le groupe '+this.name+' depuis le cache');
|
|
}
|
|
}
|
|
}
|
|
|
|
function Contributor(name,email,id) {
|
|
this.name=name;
|
|
this.email=email;
|
|
this.id=id;
|
|
this.export=function() {
|
|
return {
|
|
'name': encodeURIComponent(this.name),
|
|
'email': encodeURIComponent(this.email)
|
|
};
|
|
}
|
|
}
|
|
|
|
function Contribution(contributor,cost,title,date,uuid,lastChange) {
|
|
this.contributor=contributor;
|
|
this.cost=cost;
|
|
this.title=title;
|
|
this.date=date;
|
|
this.uuid=uuid || generate_uuid();
|
|
this.lastChange=lastChange || new Date().getTime();
|
|
this.export=function() {
|
|
return {
|
|
'contributor': encodeURIComponent(this.contributor.name),
|
|
'uuid': this.uuid,
|
|
'cost': this.cost,
|
|
'title': encodeURIComponent(this.title),
|
|
'date': this.date,
|
|
'lastChange': this.lastChange,
|
|
};
|
|
}
|
|
|
|
this.getTitle=function() {
|
|
if (jQuery.type(this.title)=='string') {
|
|
return this.title;
|
|
}
|
|
return '';
|
|
}
|
|
}
|
|
|
|
function SyncServer() {
|
|
this.url=false;
|
|
this.email=false;
|
|
this.password=false;
|
|
this.logged=false;
|
|
|
|
this.login=function(url,email,password,onsuccess,onerror) {
|
|
this.url=url;
|
|
this.email=email;
|
|
this.password=password;
|
|
|
|
try {
|
|
jQuery.getJSON(
|
|
this.url+'/login',
|
|
{'email':email,'password':password},
|
|
function(data, textStatus) {
|
|
console.log(data);
|
|
if (textStatus=='success') {
|
|
if(jQuery.type(data.email) && jQuery.type(data.name)) {
|
|
console.log('Login success return');
|
|
console.log(onsuccess);
|
|
onsuccess(data);
|
|
return true;
|
|
}
|
|
}
|
|
onerror(data);
|
|
}
|
|
).fail(onerror);
|
|
}
|
|
catch(e) {
|
|
if(jQuery.type(onerror)=='function') {
|
|
onerror();
|
|
}
|
|
}
|
|
}
|
|
|
|
this.sync=function(url,email,password,groups,onsuccess,onerror) {
|
|
this.url=url;
|
|
this.email=email;
|
|
this.password=password;
|
|
try {
|
|
jQuery.getJSON(
|
|
this.url+'/sync',
|
|
{
|
|
'email':email,
|
|
'password':password,
|
|
'groups': JSON.stringify(groups)
|
|
},
|
|
function(data, textStatus) {
|
|
console.log(data);
|
|
if (textStatus=='success') {
|
|
if(jQuery.type(data.groups)) {
|
|
console.log('Sync success return');
|
|
onsuccess(data);
|
|
return true;
|
|
}
|
|
}
|
|
onerror(data);
|
|
}
|
|
).fail(onerror);
|
|
}
|
|
catch(e) {
|
|
if(jQuery.type(onerror)=='function') {
|
|
onerror();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|