Benjamin Renard commited on 2016-09-07 23:23:15
Showing 4 changed files, with 136 additions and 101 deletions.
... | ... |
@@ -280,7 +280,7 @@ on_li_click=function(event) { |
280 | 280 |
if (cat) { |
281 | 281 |
var thing=cat.byLabel(li.data('label')); |
282 | 282 |
if (thing) { |
283 |
- thing.checked=li.hasClass('done'); |
|
283 |
+ thing.setChecked(li.hasClass('done')); |
|
284 | 284 |
scases.save(); |
285 | 285 |
} |
286 | 286 |
show_scase(scase,cat.name); |
... | ... |
@@ -315,7 +315,7 @@ on_valid_add_thing_modal=function (e) { |
315 | 315 |
alert("Cet élément existe déjà !"); |
316 | 316 |
return; |
317 | 317 |
} |
318 |
- cat.things.push(new Thing(label,false)); |
|
318 |
+ cat.newThing(label); |
|
319 | 319 |
scases.save(); |
320 | 320 |
show_scase(scase,cat.name); |
321 | 321 |
} |
... | ... |
@@ -405,15 +405,13 @@ show_cat=function(cat,displayed) { |
405 | 405 |
var panel_title=$('<h4 class="panel-title">'+cat.name+' </h4>'); |
406 | 406 |
panel_title.bind('click',on_title_click); |
407 | 407 |
|
408 |
- |
|
409 |
- var count=cat.count(); |
|
410 |
- var countDone=cat.countDone(); |
|
408 |
+ var stats=cat.stats(); |
|
411 | 409 |
var tag=$('<span class="count-tag pull-right"></span>'); |
412 |
- if (count==countDone) { |
|
410 |
+ if (stats.things==stats.done) { |
|
413 | 411 |
tag.append($('<span class="label label-success"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span></span>')); |
414 | 412 |
} |
415 | 413 |
else { |
416 |
- tag.append($('<span class="badge">'+countDone+' / '+count+'</span>')); |
|
414 |
+ tag.append($('<span class="badge">'+stats.done+' / '+stats.things+'</span>')); |
|
417 | 415 |
} |
418 | 416 |
|
419 | 417 |
var delete_btn=$('<button class="btn btn-default btn-xs pull-right"><span class="glyphicon glyphicon-trash"></button>'); |
... | ... |
@@ -1,54 +1,31 @@ |
1 |
-exampleData={ |
|
2 |
- 'lastChange': 0, |
|
3 |
- 'scases': { |
|
4 |
- 0: { |
|
5 |
- 'name': 'Vacances', |
|
6 |
- 'cats': { |
|
7 |
- 'lastChange': 0, |
|
8 |
- 'cats': { |
|
9 |
- 0: { |
|
10 |
- 'name': 'Papier', |
|
1 |
+ |
|
2 |
+ |
|
3 |
+function SCaseList() { |
|
4 |
+ lastChange=0; |
|
5 |
+ |
|
6 |
+ this.importExampleData=function() { |
|
7 |
+ var exampleData={ |
|
8 |
+ 'Vacances': { |
|
9 |
+ 'Papier': { |
|
11 | 10 |
'color': '#f00', |
12 |
- 'things': [ |
|
13 |
- { |
|
14 |
- 'label': 'Papier blanc', |
|
15 |
- 'checked': false |
|
11 |
+ 'things': ['Papier blanc', 'Stylo', "Carte d'identité"] |
|
16 | 12 |
}, |
17 |
- { |
|
18 |
- 'label': 'Stylo', |
|
19 |
- 'checked': true |
|
20 |
- }, |
|
21 |
- { |
|
22 |
- 'label': "Carte d'identité", |
|
23 |
- 'checked': false |
|
24 |
- } |
|
25 |
- ] |
|
26 |
- }, |
|
27 |
- 1: { |
|
28 |
- 'name': 'Multimédia', |
|
13 |
+ 'Multimédia' : { |
|
29 | 14 |
'color': '#0f0', |
30 |
- 'things': [ |
|
31 |
- { |
|
32 |
- 'label': 'Montre', |
|
33 |
- 'checked': false |
|
34 |
- }, |
|
35 |
- { |
|
36 |
- 'label': 'Chargeur montre', |
|
37 |
- 'checked': true |
|
38 |
- }, |
|
39 |
- { |
|
40 |
- 'label': "PC", |
|
41 |
- 'checked': false |
|
15 |
+ 'things': ['Montre', 'Chargeur montre', "PC portable"] |
|
42 | 16 |
} |
43 |
- ] |
|
44 | 17 |
} |
18 |
+ }; |
|
19 |
+ for (scaseName in exampleData) { |
|
20 |
+ var scase=this.newSCase(scaseName); |
|
21 |
+ for (catName in exampleData[scaseName]) { |
|
22 |
+ var cat=scase.cats.newCat(catName); |
|
23 |
+ for (idx in exampleData[scaseName][catName].things) { |
|
24 |
+ cat.newThing(exampleData[scaseName][catName].things[idx]); |
|
45 | 25 |
} |
46 | 26 |
} |
47 | 27 |
} |
48 | 28 |
} |
49 |
-}; |
|
50 |
-function SCaseList() { |
|
51 |
- lastChange=0; |
|
52 | 29 |
|
53 | 30 |
this.loadFromLocalStorage=function() { |
54 | 31 |
if (jQuery.type(localStorage.scases)!='undefined') { |
... | ... |
@@ -56,7 +33,7 @@ function SCaseList() { |
56 | 33 |
var data=JSON.parse(localStorage.scases); |
57 | 34 |
this.lastChange=data.lastChange; |
58 | 35 |
for (el in data.scases) { |
59 |
- this[el]=new SCase(false,data.scases[el]); |
|
36 |
+ this[el]=new SCase(false,false,data.scases[el]); |
|
60 | 37 |
} |
61 | 38 |
} |
62 | 39 |
catch(e) { |
... | ... |
@@ -75,10 +52,13 @@ function SCaseList() { |
75 | 52 |
} |
76 | 53 |
else { |
77 | 54 |
myconfirm("<h2>Bienvenu !</h2><p>Souhaitez-vous charger les données d'exemple ?</p>", |
78 |
- function(data) { |
|
79 |
- localStorage.scases=JSON.stringify(exampleData); |
|
80 |
- location.reload(); |
|
81 |
- } |
|
55 |
+ function(scases) { |
|
56 |
+ scases.importExampleData(); |
|
57 |
+ scases.save(); |
|
58 |
+ show_scases(); |
|
59 |
+ }, |
|
60 |
+ false, |
|
61 |
+ this |
|
82 | 62 |
); |
83 | 63 |
} |
84 | 64 |
} |
... | ... |
@@ -101,7 +81,7 @@ function SCaseList() { |
101 | 81 |
} |
102 | 82 |
this.lastChange=data.lastChange; |
103 | 83 |
for (el in data.scases) { |
104 |
- this[el]=new SCase(false,data.scases[el]); |
|
84 |
+ this[el]=new SCase(false,false,data.scases[el]); |
|
105 | 85 |
} |
106 | 86 |
return true; |
107 | 87 |
} |
... | ... |
@@ -155,9 +135,10 @@ function SCaseList() { |
155 | 135 |
} |
156 | 136 |
|
157 | 137 |
this.newSCase=function(name) { |
158 |
- if (!this.isSCase(this[name])) { |
|
159 |
- this[name]=new SCase(name); |
|
160 |
- return this[name]; |
|
138 |
+ if (!this.byName(this[name])) { |
|
139 |
+ var uuid=uuid||generate_uuid(); |
|
140 |
+ this[uuid]=new SCase(uuid,name); |
|
141 |
+ return this[uuid]; |
|
161 | 142 |
} |
162 | 143 |
return false; |
163 | 144 |
} |
... | ... |
@@ -166,6 +147,7 @@ function SCaseList() { |
166 | 147 |
var scase=this.byName(name); |
167 | 148 |
if (scase && !this.byName(newname)) { |
168 | 149 |
scase.name=newname; |
150 |
+ scase.lastChange=new Date().getTime(); |
|
169 | 151 |
return scase; |
170 | 152 |
} |
171 | 153 |
return false; |
... | ... |
@@ -174,9 +156,12 @@ function SCaseList() { |
174 | 156 |
this.copySCase=function(name,newname) { |
175 | 157 |
var orig_scase=this.byName(name); |
176 | 158 |
if (this.isSCase(orig_scase) && !this.byName(newname)) { |
177 |
- this[newname]=new SCase(false,orig_scase.export()); |
|
178 |
- this[newname].name=newname; |
|
179 |
- return this[newname]; |
|
159 |
+ var uuid=uuid||generate_uuid(); |
|
160 |
+ this[uuid]=new SCase(false,false,orig_scase.export()); |
|
161 |
+ this[uuid].uuid=uuid; |
|
162 |
+ this[uuid].lastChange=new Date().getTime(); |
|
163 |
+ this[uuid].name=newname; |
|
164 |
+ return this[uuid]; |
|
180 | 165 |
} |
181 | 166 |
return false; |
182 | 167 |
} |
... | ... |
@@ -191,16 +176,30 @@ function SCaseList() { |
191 | 176 |
} |
192 | 177 |
} |
193 | 178 |
|
194 |
-function SCase(name,data) { |
|
179 |
+function SCase(uuid,name,data) { |
|
180 |
+ this.uuid=uuid||generate_uuid(); |
|
195 | 181 |
this.name=name; |
196 | 182 |
this.cats=new CatList(); |
183 |
+ this.lastChange=new Date().getTime(); |
|
197 | 184 |
|
198 | 185 |
this.isSCase=function() { |
199 | 186 |
return true; |
200 | 187 |
} |
201 | 188 |
|
189 |
+ this.import=function(data) { |
|
190 |
+ this.uuid=data.uuid || generate_uuid(); |
|
191 |
+ this.lastChange=data.lastChange || new Date().getTime(); |
|
192 |
+ this.name=decodeURIComponent(data.name); |
|
193 |
+ if (jQuery.type(data.cats) == 'object') { |
|
194 |
+ this.cats=new CatList(data.cats); |
|
195 |
+ } |
|
196 |
+ return true; |
|
197 |
+ } |
|
198 |
+ |
|
202 | 199 |
this.export=function() { |
203 | 200 |
return { |
201 |
+ 'uuid': this.uuid, |
|
202 |
+ 'lastChange': this.lastChange, |
|
204 | 203 |
'name': encodeURIComponent(this.name), |
205 | 204 |
'cats': this.cats.export() |
206 | 205 |
}; |
... | ... |
@@ -243,6 +242,7 @@ function SCase(name,data) { |
243 | 242 |
} |
244 | 243 |
} |
245 | 244 |
}); |
245 |
+ this.lastChange=new Date().getTime(); |
|
246 | 246 |
return true; |
247 | 247 |
} |
248 | 248 |
|
... | ... |
@@ -251,10 +251,7 @@ function SCase(name,data) { |
251 | 251 |
*/ |
252 | 252 |
if (jQuery.type(data)=='object') { |
253 | 253 |
try { |
254 |
- this.name=decodeURIComponent(data.name); |
|
255 |
- if (jQuery.type(data.cats) == 'object') { |
|
256 |
- this.cats=new CatList(data.cats); |
|
257 |
- } |
|
254 |
+ this.import(data); |
|
258 | 255 |
} |
259 | 256 |
catch (e) { |
260 | 257 |
console.log(e); |
... | ... |
@@ -266,15 +263,10 @@ function SCase(name,data) { |
266 | 263 |
|
267 | 264 |
|
268 | 265 |
function CatList(data) { |
269 |
- lastChange=0; |
|
270 |
- |
|
271 | 266 |
this.export=function() { |
272 |
- return { |
|
273 |
- 'lastChange': this.lastChange, |
|
274 |
- 'cats': this.each(function(idx,cat) { |
|
267 |
+ return this.each(function(idx,cat) { |
|
275 | 268 |
return cat.export(); |
276 |
- }) |
|
277 |
- }; |
|
269 |
+ }); |
|
278 | 270 |
} |
279 | 271 |
|
280 | 272 |
this.import=function(data) { |
... | ... |
@@ -283,9 +275,8 @@ function CatList(data) { |
283 | 275 |
delete this[el]; |
284 | 276 |
} |
285 | 277 |
} |
286 |
- this.lastChange=data.lastChange; |
|
287 |
- for (el in data.cats) { |
|
288 |
- this[el]=new Cat(el,false,data.cats[el]); |
|
278 |
+ for (el in data) { |
|
279 |
+ this[el]=new Cat(el,false,false,data[el]); |
|
289 | 280 |
} |
290 | 281 |
return true; |
291 | 282 |
} |
... | ... |
@@ -326,8 +317,9 @@ function CatList(data) { |
326 | 317 |
|
327 | 318 |
this.newCat=function(name) { |
328 | 319 |
if (!this.isCat(this[name])) { |
329 |
- this[name]=new Cat(name); |
|
330 |
- return this[name]; |
|
320 |
+ var uuid=uuid||generate_uuid(); |
|
321 |
+ this[uuid]=new Cat(uuid,name); |
|
322 |
+ return this[uuid]; |
|
331 | 323 |
} |
332 | 324 |
return false; |
333 | 325 |
} |
... | ... |
@@ -336,6 +328,7 @@ function CatList(data) { |
336 | 328 |
var cat=this.byName(name); |
337 | 329 |
if (cat && !this.byName(newname)) { |
338 | 330 |
cat.name=newname; |
331 |
+ cat.lastChange=new Date().getTime(); |
|
339 | 332 |
return cat; |
340 | 333 |
} |
341 | 334 |
return false; |
... | ... |
@@ -368,34 +361,45 @@ function CatList(data) { |
368 | 361 |
|
369 | 362 |
} |
370 | 363 |
|
371 |
-function Cat(name,color,data) { |
|
364 |
+function Cat(uuid,name,color,data) { |
|
365 |
+ this.uuid=generate_uuid(); |
|
366 |
+ this.lastChange=new Date().getTime(); |
|
372 | 367 |
this.name=name; |
373 | 368 |
this.color=color || '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6); |
374 |
- this.things=[]; |
|
369 |
+ this.things={}; |
|
375 | 370 |
|
376 | 371 |
this.isCat=function() { |
377 | 372 |
return true; |
378 | 373 |
} |
379 | 374 |
|
375 |
+ this.import=function(data) { |
|
376 |
+ this.uuid=data.uuid || generate_uuid(); |
|
377 |
+ this.lastChange=data.lastChange||new Date().getTime(); |
|
378 |
+ this.name=decodeURIComponent(data.name); |
|
379 |
+ this.color=data.color; |
|
380 |
+ if (jQuery.type(data.things) == 'object') { |
|
381 |
+ for (tuuid in data.things) { |
|
382 |
+ this.things[tuuid]=new Thing(tuuid); |
|
383 |
+ this.things[tuuid].import(data.things[tuuid]); |
|
384 |
+ } |
|
385 |
+ } |
|
386 |
+ return true; |
|
387 |
+ } |
|
388 |
+ |
|
380 | 389 |
this.export=function() { |
381 |
- var things=[]; |
|
382 |
- for (idx in this.things) { |
|
383 |
- things.push(this.things[idx].export()); |
|
390 |
+ var things={}; |
|
391 |
+ for (tuuid in this.things) { |
|
392 |
+ things[tuuid]=this.things[tuuid].export(); |
|
384 | 393 |
} |
385 | 394 |
return { |
395 |
+ 'uuid': this.uuid, |
|
396 |
+ 'lastChange': this.lastChange, |
|
386 | 397 |
'name': encodeURIComponent(this.name), |
387 | 398 |
'color': this.color, |
388 | 399 |
'things': things |
389 | 400 |
}; |
390 | 401 |
} |
391 | 402 |
|
392 |
- this.importThing=function(data) { |
|
393 |
- return new Thing( |
|
394 |
- decodeURIComponent(data.label), |
|
395 |
- data.checked |
|
396 |
- ); |
|
397 |
- } |
|
398 |
- |
|
399 | 403 |
this.byLabel=function(label) { |
400 | 404 |
for (idx in this.things) { |
401 | 405 |
if (label==this.things[idx].label) { |
... | ... |
@@ -406,23 +410,38 @@ function Cat(name,color,data) { |
406 | 410 |
} |
407 | 411 |
|
408 | 412 |
this.count=function() { |
409 |
- return this.things.length; |
|
413 |
+ return keys(this.things).length; |
|
410 | 414 |
} |
411 | 415 |
|
412 |
- this.countDone=function() { |
|
416 |
+ this.stats=function() { |
|
413 | 417 |
var count=0; |
418 |
+ var done=0; |
|
414 | 419 |
for (idx in this.things) { |
415 | 420 |
if (this.things[idx].checked) { |
421 |
+ done+=1; |
|
422 |
+ } |
|
416 | 423 |
count+=1; |
417 | 424 |
} |
425 |
+ return { |
|
426 |
+ 'things': count, |
|
427 |
+ 'done': done |
|
428 |
+ }; |
|
418 | 429 |
} |
419 |
- return count; |
|
430 |
+ |
|
431 |
+ this.newThing=function(label) { |
|
432 |
+ if (!this.byLabel(label)) { |
|
433 |
+ var uuid=generate_uuid(); |
|
434 |
+ this.things[uuid]=new Thing(uuid,label); |
|
435 |
+ return true; |
|
436 |
+ } |
|
437 |
+ return false; |
|
420 | 438 |
} |
421 | 439 |
|
422 | 440 |
this.renameThing=function(label,newlabel) { |
423 | 441 |
var thing=this.byLabel(label); |
424 | 442 |
if (thing && !this.byLabel(newlabel)) { |
425 | 443 |
thing.label=newlabel; |
444 |
+ thing.lastChange=new Date().getTime(); |
|
426 | 445 |
return thing; |
427 | 446 |
} |
428 | 447 |
return false; |
... | ... |
@@ -443,13 +462,7 @@ function Cat(name,color,data) { |
443 | 462 |
*/ |
444 | 463 |
if (jQuery.type(data)=='object') { |
445 | 464 |
try { |
446 |
- this.name=decodeURIComponent(data.name); |
|
447 |
- this.color=data.color; |
|
448 |
- if (jQuery.type(data.things) == 'array') { |
|
449 |
- for (idx in data.things) { |
|
450 |
- this.things.push(this.importThing(data.things[idx])); |
|
451 |
- } |
|
452 |
- } |
|
465 |
+ this.import(data); |
|
453 | 466 |
} |
454 | 467 |
catch (e) { |
455 | 468 |
console.log(e); |
... | ... |
@@ -459,13 +472,30 @@ function Cat(name,color,data) { |
459 | 472 |
|
460 | 473 |
} |
461 | 474 |
|
462 |
-function Thing(label,checked) { |
|
475 |
+function Thing(uuid,label,checked) { |
|
476 |
+ this.uuid=uuid||generate_uuid(); |
|
477 |
+ this.lastChange=new Date().getTime(); |
|
463 | 478 |
this.label=label; |
464 | 479 |
this.checked=checked; |
480 |
+ |
|
481 |
+ this.import=function(data) { |
|
482 |
+ this.uuid=data.uuid||generate_uuid(); |
|
483 |
+ this.lastChange=data.lastChange||new Date().getTime(); |
|
484 |
+ this.label=decodeURIComponent(data.label), |
|
485 |
+ this.checked=data.checked; |
|
486 |
+ } |
|
487 |
+ |
|
465 | 488 |
this.export=function() { |
466 | 489 |
return { |
490 |
+ 'uuid': this.uuid, |
|
491 |
+ 'lastChange': this.lastChange, |
|
467 | 492 |
'label': encodeURIComponent(this.label), |
468 | 493 |
'checked': this.checked |
469 | 494 |
}; |
470 | 495 |
} |
496 |
+ |
|
497 |
+ this.setChecked=function(value) { |
|
498 |
+ this.checked=value; |
|
499 |
+ this.lastChange=new Date().getTime(); |
|
500 |
+ } |
|
471 | 501 |
} |
... | ... |
@@ -284,6 +284,7 @@ div.panel-heading, li.list-group-item, a { |
284 | 284 |
|
285 | 285 |
</script> |
286 | 286 |
|
287 |
+<script src="inc/lib/uuid.js"></script> |
|
287 | 288 |
<script src="inc/mydialog.js"></script> |
288 | 289 |
<script src="inc/mysc_objects.js"></script> |
289 | 290 |
<script src="inc/main.js"></script> |
290 | 291 |