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 |