4baf634bdbe11fbce11e3ddc61a248de58160239
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

1) function GroupList() {
Benjamin Renard Add lastChange field in obj...

Benjamin Renard authored 10 years ago

2) 
3)   lastChange=0;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

4)   
5)   this.loadFromLocalStorage=function() {
Benjamin Renard Manage local data loading e...

Benjamin Renard authored 10 years ago

6)     if (jQuery.type(localStorage.groups)!='undefined') {
7)       try {
8)         var data=JSON.parse(localStorage.groups);
9)         this.lastChange=data.lastChange;
10)         for (el in data.groups) {
11)           this[el]=new Group(el,data.groups[el]);
12)         }
13)       }
14)       catch(e) {
15)         for (el in this) {
16)           if (this.isGroup(this[el])) {
17)             delete this[el];
18)           }
19)         }
20)         myconfirm('Erreur en chargeant les données locales. On les purges ?',
21)           function(data) {
22)             delete localStorage.groups;
23)             location.reload();
24)           }
25)         );
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

26)       }
27)     }
28)   }
29) 
30)   this.export=function() {
Benjamin Renard Improve GroupsList each() m...

Benjamin Renard authored 10 years ago

31)     return this.each(function(idx,group) {
32)       return group.export();
33)     });
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

34)   }
35) 
Benjamin Renard Add login and sync support

Benjamin Renard authored 10 years ago

36)   this.import=function(groups) {
37)     ret={};
38)     for (el in this) {
39)       if (this.isGroup(this[el])) {
40)         delete ret[el];
41)       }
42)     }
43)     for (el in groups) {
44)       this[el]=new Group(el,groups[el]);
45)     }
46)     return true;
47)   }
48) 
49) 
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

50)   this.save=function() {
Benjamin Renard Add lastChange field in obj...

Benjamin Renard authored 10 years ago

51)     localStorage.groups=JSON.stringify({
52)       'lastChange': new Date().getTime(),
53)       'groups': this.export()
54)     });
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

55)   }
56) 
57)   this.each=function(fct) {
58)     var idx=0;
Benjamin Renard Improve GroupsList each() m...

Benjamin Renard authored 10 years ago

59)     var ret={};
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

60)     for (el in this) {
61)       if(this.isGroup(this[el])) {
Benjamin Renard Improve GroupsList each() m...

Benjamin Renard authored 10 years ago

62)         ret[el]=fct(idx++,this[el]);
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

63)       }
64)     }
Benjamin Renard Improve GroupsList each() m...

Benjamin Renard authored 10 years ago

65)     return ret;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

66)   }
67) 
68)   this.count=function() {
69)     len=0;
Benjamin Renard Improve GroupsList each() m...

Benjamin Renard authored 10 years ago

70)     this.each(function(idx,group) {
71)       len=len+1;
72)     });
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

73)     return len;
74)   }
75) 
76)   this.isGroup=function(el) {
Benjamin Renard Improve GroupList isGroup()...

Benjamin Renard authored 10 years ago

77)     return (jQuery.type(el)=='object' && jQuery.type(el.isGroup)=='function' && el.isGroup());
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

78)   }
79) 
80)   this.removeGroup=function(name) {
81)     if (this.isGroup(this[name])) {
82)       delete this[name];
83)       return true;
84)     }
85)     return false;
86)   }
Benjamin Renard Add GroupList balances() me...

Benjamin Renard authored 10 years ago

87) 
88)   this.balances=function(fct) {
89)     return this.each(function(idx,group) {
90)       return group.balance();
91)     });
92)   }
93) 
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

94) }
95) 
96) function Group(name,data) {
97)   this.name=name;
98)   this.contributors=[];
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

99)   this.contributions={};
100)   this.deletedContributions={};
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

101) 
102) 
103)   this.isGroup=function() {
104)     return true;
105)   }
106) 
107)   this.export=function() {
108)     var contributors=[];
109)     for (idx in this.contributors) {
110)       contributors.push(this.contributors[idx].export());
111)     }
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

112)     var contributions={}
113)     for (uuid in this.contributions) {
114)       contributions[uuid]=this.contributions[uuid].export();
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

115)     }
116)     return {
Benjamin Renard Encode/Decode on import/exp...

Benjamin Renard authored 10 years ago

117)       'name': encodeURIComponent(this.name),
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

118)       'contributors': contributors,
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

119)       'contributions': contributions,
120)       'deletedContributions': this.deletedContributions
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

121)     };
122)   }
123) 
Benjamin Renard Clean code

Benjamin Renard authored 10 years ago

124)   /*
125)    * Contributors
126)    */
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

127)   this.removeContributor=function(c) {
128)     this.contributors=this.contributors.filter(function(v){
129)       return (v.name!=c);
130)     });
131)   }
132) 
133)   this.contributorByName=function(name) {
134)     for (c in this.contributors) {
135)       if (this.contributors[c].name == name) return this.contributors[c];
136)     }
137)     return undefined;
138)   }
139) 
140)   this.contributorByEmail=function(email) {
141)     for (c in this.contributors) {
142)       if (this.contributors[c].email == email) return this.contributors[c];
143)     }
144)     return undefined;
145)   }
146) 
Benjamin Renard Clean code

Benjamin Renard authored 10 years ago

147)   this.addContributor=function(c) {
148)     c.id=this.contributors.length;
149)     this.contributors.push(c);
150)   }
151) 
152)   this.replaceContributor=function(idx,c) {
153)     c.id=idx;
154)     this.contributors[idx]=c;
155)   }
156) 
157)   /*
158)    * Contributions
159)    */
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

160)   this.contributionsByContributorName=function(name) {
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

161)     var ret={};
162)     for (uuid in this.contributions) {
163)       if (this.contributions[uuid].contributor.name==name) {
164)         ret[uuid]=this.contributions[uuid];
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

165)       }
166)     }
167)     return ret;
168)   }
169) 
170)   this.addContribution=function(c) {
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

171)     this.contributions[c.uuid]=c;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

172)   }
173) 
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

174)   this.updateContribution=function(uuid,c) {
175)     c.uuid=uuid;
176)     this.contributions[uuid]=c;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

177)   }
178) 
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

179)   this.deleteContribution=function(uuid) {
180)     this.contributions[uuid].lastChange=new Date().getTime();
181)     this.deletedContributions[uuid]=this.contributions[uuid].export();
182)     delete this.contributions[uuid];
183)   }
184) 
185) 
Benjamin Renard Clean code

Benjamin Renard authored 10 years ago

186)   /*
187)    * Balance
188)    */
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

189)   this.balance=function() {
Benjamin Renard Improve balance display

Benjamin Renard authored 10 years ago

190)     total={}
191)     min=-1;
192)     max=0;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

193)     for (idx in this.contributors) {
Benjamin Renard Improve balance display

Benjamin Renard authored 10 years ago

194)       var sum=0;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

195)       c=this.contributors[idx].name;
196)       cl=this.contributionsByContributorName(c);
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

197)       for (uuid in cl) {
198)         sum+=cl[uuid].cost;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

199)       }
Benjamin Renard Improve balance display

Benjamin Renard authored 10 years ago

200)       if (min==-1 || min>sum) {
201)           min=sum;
202)         }
203)       if(max<sum) {
204)         max=sum;
205)       }
206)       total[c]=sum;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

207)     }
Benjamin Renard Improve balance display

Benjamin Renard authored 10 years ago

208)     balance={}
209)     var sum=0;
210)     for (c in total) {
211)       balance[c]={
212)         'total': total[c],
213)         'diff': total[c]-max,
214)       }
215)       sum=sum+total[c];
216)     }
217)     return {
218)       'balance': balance,
219)       'sum': sum,
220)       'min': min,
221)       'max': max
222)     };
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

223)   }
224) 
Benjamin Renard Clean code

Benjamin Renard authored 10 years ago

225)   /*
226)    * Contructor
227)    */
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

228)   if (jQuery.type(data)=='object') {
229)     try {
Benjamin Renard Clean code

Benjamin Renard authored 10 years ago

230)       this.name=data.name;
231)       if (jQuery.type(data.contributors) == 'array') {
232)         for (idx in data.contributors) {
233)           this.contributors.push(new Contributor(
Benjamin Renard Encode/Decode on import/exp...

Benjamin Renard authored 10 years ago

234)             decodeURIComponent(data.contributors[idx].name),
235)             decodeURIComponent(data.contributors[idx].email),
Benjamin Renard Clean code

Benjamin Renard authored 10 years ago

236)             idx
237)           ));
238)         }
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

239)       }
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

240)       if (jQuery.type(data.contributions) == 'object') {
241)         for (uuid in data.contributions) {
242)           this.contributions[uuid]=new Contribution(
243)             this.contributorByName(data.contributions[uuid].contributor),
244)             data.contributions[uuid].cost,
245)             decodeURIComponent(data.contributions[uuid].title),
246)             data.contributions[uuid].date,
247)             uuid,
248)             data.contributions[uuid].lastChange
249)           );
250)         }
251)       }
252)       if (jQuery.type(data.deletedContributions) == 'object') {
253)         for (uuid in data.deletedContributions) {
254)           this.deletedContributions[uuid]=data.deletedContributions[uuid];
Benjamin Renard Clean code

Benjamin Renard authored 10 years ago

255)         }
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

256)       }
257)     }
258)     catch (e) {
259)       alert('Une erreur est survenue en chargeant le groupe '+this.name+' depuis le cache');
260)     }
261)   }
262) }
263) 
Benjamin Renard Add edit contributor feature

Benjamin Renard authored 10 years ago

264) function Contributor(name,email,id) {
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

265)   this.name=name;
266)   this.email=email;
Benjamin Renard Add edit contributor feature

Benjamin Renard authored 10 years ago

267)   this.id=id;
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

268)   this.export=function() {
269)     return {
Benjamin Renard Encode/Decode on import/exp...

Benjamin Renard authored 10 years ago

270)       'name': encodeURIComponent(this.name),
271)       'email': encodeURIComponent(this.email)
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

272)     };
273)   }
274) }
275) 
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

276) function Contribution(contributor,cost,title,date,uuid,lastChange) {
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

277)   this.contributor=contributor;
278)   this.cost=cost;
279)   this.title=title;
280)   this.date=date;
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

281)   this.uuid=uuid || generate_uuid();
Benjamin Renard Add lastChange field in obj...

Benjamin Renard authored 10 years ago

282)   this.lastChange=lastChange || new Date().getTime();
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

283)   this.export=function() {
284)     return {
Benjamin Renard Encode/Decode on import/exp...

Benjamin Renard authored 10 years ago

285)       'contributor': encodeURIComponent(this.contributor.name),
Benjamin Renard Use UUID as Contribution id...

Benjamin Renard authored 10 years ago

286)       'uuid': this.uuid,
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

287)       'cost': this.cost,
Benjamin Renard Encode/Decode on import/exp...

Benjamin Renard authored 10 years ago

288)       'title': encodeURIComponent(this.title),
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

289)       'date': this.date,
Benjamin Renard Add lastChange field in obj...

Benjamin Renard authored 10 years ago

290)       'lastChange': this.lastChange,
Benjamin Renard Initial commit

Benjamin Renard authored 10 years ago

291)     };
292)   }
293) 
294)   this.getTitle=function() {
295)     if (jQuery.type(this.title)=='string') {
296)       return this.title;
297)     }
298)     return '';
299)   }
300) }