659 lines
14 KiB
JavaScript
659 lines
14 KiB
JavaScript
function SCaseList() {
|
|
lastChange = 0;
|
|
|
|
this.importExampleData = function () {
|
|
var exampleData = {
|
|
Vacances: {
|
|
Papier: {
|
|
color: "#f00",
|
|
things: [
|
|
{ label: _("White paper"), nb: 1 },
|
|
{ label: _("Pen"), nb: 3 },
|
|
{ label: _("ID card/passport"), nb: 1 },
|
|
],
|
|
},
|
|
Multimédia: {
|
|
color: "#0f0",
|
|
things: [
|
|
{ label: _("Watch"), nb: 1 },
|
|
{ label: _("Watch charger"), nb: 1 },
|
|
{ label: _("Laptop"), nb: 1 },
|
|
{ label: _("Laptop charger"), nb: 1 },
|
|
],
|
|
},
|
|
},
|
|
};
|
|
for (scaseName in exampleData) {
|
|
var scase = this.newSCase(scaseName);
|
|
for (catName in exampleData[scaseName]) {
|
|
var cat = scase.cats.newCat(catName);
|
|
for (idx in exampleData[scaseName][catName].things) {
|
|
cat.newThing(
|
|
exampleData[scaseName][catName].things[idx]["label"],
|
|
exampleData[scaseName][catName].things[idx]["nb"]
|
|
);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
this.loadFromLocalStorage = function (data) {
|
|
if (jQuery.type(localStorage.scases) != "undefined") {
|
|
try {
|
|
return this.loadFromJsonData(JSON.parse(localStorage.scases));
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
|
|
this.loadFromJsonData = function (data) {
|
|
try {
|
|
this.lastChange = data.lastChange;
|
|
for (el in data.scases) {
|
|
this[el] = new SCase(false, false, data.scases[el]);
|
|
}
|
|
return true;
|
|
} catch (e) {
|
|
for (el in this) {
|
|
if (this.isSCase(this[el])) {
|
|
delete this[el];
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.export = function () {
|
|
return {
|
|
lastChange: this.lastChange,
|
|
scases: this.each(function (idx, scase) {
|
|
return scase.export();
|
|
}),
|
|
};
|
|
};
|
|
|
|
this.import = function (data) {
|
|
ret = {};
|
|
for (el in this) {
|
|
if (this.isSCase(this[el])) {
|
|
delete ret[el];
|
|
}
|
|
}
|
|
this.lastChange = data.lastChange;
|
|
for (el in data.scases) {
|
|
this[el] = new SCase(false, false, data.scases[el]);
|
|
}
|
|
return true;
|
|
};
|
|
|
|
this.save = function () {
|
|
localStorage.scases = JSON.stringify(this.export());
|
|
};
|
|
|
|
this.each = function (fct) {
|
|
var idx = 0;
|
|
var ret = {};
|
|
for (el in this) {
|
|
if (this.isSCase(this[el])) {
|
|
ret[el] = fct(idx++, this[el]);
|
|
}
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
this.count = function () {
|
|
len = 0;
|
|
this.each(function (idx, scase) {
|
|
len = len + 1;
|
|
});
|
|
return len;
|
|
};
|
|
|
|
this.isSCase = function (el) {
|
|
return (
|
|
jQuery.type(el) == "object" &&
|
|
jQuery.type(el.isSCase) == "function" &&
|
|
el.isSCase()
|
|
);
|
|
};
|
|
|
|
this.byName = function (name) {
|
|
for (el in this) {
|
|
if (this.isSCase(this[el])) {
|
|
if (this[el].name == name) {
|
|
return this[el];
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.byUUID = function (uuid) {
|
|
return this.isCase(this[uuid]) ? this[uuid] : null;
|
|
};
|
|
|
|
this.removeSCase = function (name) {
|
|
for (el in this) {
|
|
if (this.isSCase(this[el]) && this[el].name == name) {
|
|
this[el].remove();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.newSCase = function (name) {
|
|
if (this.byName(this[name])) {
|
|
var scase = this.byName(name);
|
|
if (scase.removed) {
|
|
scase.restore();
|
|
return true;
|
|
}
|
|
} else {
|
|
var uuid = uuid || generate_uuid();
|
|
this[uuid] = new SCase(uuid, name);
|
|
return this[uuid];
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.renameSCase = function (name, newname) {
|
|
var scase = this.byName(name);
|
|
if (scase && !this.byName(newname)) {
|
|
scase.name = newname;
|
|
scase.lastChange = new Date().getTime();
|
|
return scase;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.copySCase = function (name, newname) {
|
|
var orig_scase = this.byName(name);
|
|
if (this.isSCase(orig_scase) && !this.byName(newname)) {
|
|
var uuid = uuid || generate_uuid();
|
|
this[uuid] = new SCase(false, false, orig_scase.export());
|
|
this[uuid].uuid = uuid;
|
|
this[uuid].lastChange = new Date().getTime();
|
|
this[uuid].name = newname;
|
|
return this[uuid];
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.resetSCase = function (name) {
|
|
for (el in this) {
|
|
if (this.isSCase(this[el]) && this[el].name == name) {
|
|
return this[el].reset();
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
}
|
|
|
|
function SCase(uuid, name, data) {
|
|
this.uuid = uuid || generate_uuid();
|
|
this.name = name;
|
|
this.cats = new CatList();
|
|
this.lastChange = new Date().getTime();
|
|
this.removed = false;
|
|
|
|
this.isSCase = function () {
|
|
return true;
|
|
};
|
|
|
|
this.import = function (data) {
|
|
this.uuid = data.uuid || generate_uuid();
|
|
this.lastChange = data.lastChange || new Date().getTime();
|
|
this.name = decodeURIComponent(data.name);
|
|
this.removed = data.removed || false;
|
|
if (jQuery.type(data.cats) == "object") {
|
|
this.cats = new CatList(data.cats);
|
|
}
|
|
return true;
|
|
};
|
|
|
|
this.export = function () {
|
|
return {
|
|
uuid: this.uuid,
|
|
lastChange: this.lastChange,
|
|
name: encodeURIComponent(this.name),
|
|
removed: this.removed,
|
|
cats: this.cats.export(),
|
|
};
|
|
};
|
|
|
|
this.byName = function (name) {
|
|
for (idx in this.cats) {
|
|
if (name == this.cats[idx].name) {
|
|
return this.cats[idx];
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.stats = function () {
|
|
var cats = 0;
|
|
var things = 0;
|
|
var things_done = 0;
|
|
this.cats.each(function (cidx, cat) {
|
|
if (cat.removed) {
|
|
return true;
|
|
}
|
|
cats++;
|
|
for (idx in cat.things) {
|
|
if (cat.things[idx].removed) {
|
|
continue;
|
|
}
|
|
things++;
|
|
if (cat.things[idx].checked) {
|
|
things_done++;
|
|
}
|
|
}
|
|
});
|
|
return {
|
|
cats: cats,
|
|
things: things,
|
|
done: things_done,
|
|
};
|
|
};
|
|
|
|
this.reset = function () {
|
|
this.cats.each(function (idx, cat) {
|
|
for (idx in cat.things) {
|
|
cat.things[idx].reset();
|
|
}
|
|
});
|
|
return true;
|
|
};
|
|
|
|
this.remove = function () {
|
|
this.removed = true;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
|
|
this.restore = function () {
|
|
this.removed = false;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
|
|
/*
|
|
* Constructor
|
|
*/
|
|
if (jQuery.type(data) == "object") {
|
|
try {
|
|
this.import(data);
|
|
} catch (e) {
|
|
console.log(e);
|
|
alert(
|
|
_(
|
|
"An error occurred while loading the %s suitcase from the cache.",
|
|
this.name
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
function CatList(data) {
|
|
this.export = function () {
|
|
return this.each(function (idx, cat) {
|
|
return cat.export();
|
|
});
|
|
};
|
|
|
|
this.import = function (data) {
|
|
for (el in this) {
|
|
if (this.isCat(this[el])) {
|
|
delete this[el];
|
|
}
|
|
}
|
|
for (el in data) {
|
|
this[el] = new Cat(el, false, false, data[el]);
|
|
}
|
|
return true;
|
|
};
|
|
|
|
this.each = function (fct) {
|
|
var idx = 0;
|
|
var ret = {};
|
|
for (el in this) {
|
|
if (this.isCat(this[el])) {
|
|
ret[el] = fct(idx++, this[el]);
|
|
}
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
this.count = function () {
|
|
len = 0;
|
|
this.each(function (idx, cat) {
|
|
len = len + 1;
|
|
});
|
|
return len;
|
|
};
|
|
|
|
this.isCat = function (el) {
|
|
return (
|
|
jQuery.type(el) == "object" &&
|
|
jQuery.type(el.isCat) == "function" &&
|
|
el.isCat()
|
|
);
|
|
};
|
|
|
|
this.byName = function (name) {
|
|
for (el in this) {
|
|
if (this.isCat(this[el])) {
|
|
if (this[el].name == name) {
|
|
return this[el];
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.byUUID = function (uuid) {
|
|
return this.isCas(this[uuid]) ? this[uuid] : null;
|
|
};
|
|
|
|
this.newCat = function (name) {
|
|
if (this.byName(name)) {
|
|
var cat = this.byName(name);
|
|
if (cat.removed) {
|
|
cat.restore();
|
|
return true;
|
|
}
|
|
} else {
|
|
var uuid = uuid || generate_uuid();
|
|
this[uuid] = new Cat(uuid, name);
|
|
return this[uuid];
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.renameCat = function (name, newname) {
|
|
var cat = this.byName(name);
|
|
if (cat && !this.byName(newname)) {
|
|
cat.name = newname;
|
|
cat.lastChange = new Date().getTime();
|
|
return cat;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.removeCat = function (name) {
|
|
for (el in this) {
|
|
if (this.isCat(this[el]) && this[el].name == name) {
|
|
this[el].remove();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.restoreCat = function (name) {
|
|
for (el in this) {
|
|
if (this.isCat(this[el]) && this[el].name == name && this[el].removed) {
|
|
this[el].restore();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
/*
|
|
* Constructor
|
|
*/
|
|
if (jQuery.type(data) == "object") {
|
|
try {
|
|
this.import(data);
|
|
} catch (e) {
|
|
console.log(e);
|
|
alert(
|
|
_("An error occurred while loading the category list from the cache.")
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
function Cat(uuid, name, color, data) {
|
|
this.uuid = generate_uuid();
|
|
this.lastChange = new Date().getTime();
|
|
this.name = name;
|
|
this.color =
|
|
color ||
|
|
"#" + (0x1000000 + Math.random() * 0xffffff).toString(16).substr(1, 6);
|
|
this.things = {};
|
|
this.removed = false;
|
|
|
|
this.isCat = function () {
|
|
return true;
|
|
};
|
|
|
|
this.import = function (data) {
|
|
this.uuid = data.uuid || generate_uuid();
|
|
this.lastChange = data.lastChange || new Date().getTime();
|
|
this.name = decodeURIComponent(data.name);
|
|
this.color = data.color;
|
|
this.removed = data.removed || false;
|
|
if (jQuery.type(data.things) == "object") {
|
|
for (tuuid in data.things) {
|
|
this.things[tuuid] = new Thing(tuuid);
|
|
this.things[tuuid].import(data.things[tuuid]);
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
|
|
this.export = function () {
|
|
var things = {};
|
|
for (tuuid in this.things) {
|
|
things[tuuid] = this.things[tuuid].export();
|
|
}
|
|
return {
|
|
uuid: this.uuid,
|
|
lastChange: this.lastChange,
|
|
name: encodeURIComponent(this.name),
|
|
color: this.color,
|
|
removed: this.removed,
|
|
things: things,
|
|
};
|
|
};
|
|
|
|
this.byLabel = function (label) {
|
|
for (idx in this.things) {
|
|
if (label == this.things[idx].label) {
|
|
return this.things[idx];
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.count = function () {
|
|
return keys(this.things).length;
|
|
};
|
|
|
|
this.stats = function () {
|
|
var count = 0;
|
|
var done = 0;
|
|
for (idx in this.things) {
|
|
if (this.things[idx].removed) {
|
|
continue;
|
|
}
|
|
if (this.things[idx].checked) {
|
|
done += 1;
|
|
}
|
|
count += 1;
|
|
}
|
|
return {
|
|
things: count,
|
|
done: done,
|
|
};
|
|
};
|
|
|
|
this.newThing = function (label, nb) {
|
|
if (this.byLabel(label)) {
|
|
var thing = this.byLabel(label);
|
|
if (thing.removed) {
|
|
thing.restore();
|
|
thing.setChecked(false);
|
|
thing.setNb(nb);
|
|
return true;
|
|
}
|
|
} else {
|
|
var uuid = generate_uuid();
|
|
this.things[uuid] = new Thing(uuid, label, nb);
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.renameThing = function (label, newlabel) {
|
|
var thing = this.byLabel(label);
|
|
if (thing && !this.byLabel(newlabel)) {
|
|
thing.label = newlabel;
|
|
thing.lastChange = new Date().getTime();
|
|
return thing;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.removeThing = function (label) {
|
|
for (idx in this.things) {
|
|
if (this.things[idx].label == label) {
|
|
this.things[idx].remove();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.restoreThing = function (label) {
|
|
for (idx in this.things) {
|
|
if (this.things[idx].label == label && this.things[idx].removed) {
|
|
this.things[idx].restore();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.remove = function () {
|
|
this.removed = true;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
|
|
this.restore = function () {
|
|
this.removed = false;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
|
|
/*
|
|
* Constructor
|
|
*/
|
|
if (jQuery.type(data) == "object") {
|
|
try {
|
|
this.import(data);
|
|
} catch (e) {
|
|
console.log(e);
|
|
alert(
|
|
_(
|
|
"An error occurred while loading the %s category from the cache.",
|
|
this.name
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
function Thing(uuid, label, nb, checked) {
|
|
this.uuid = uuid || generate_uuid();
|
|
this.lastChange = new Date().getTime();
|
|
this.label = label;
|
|
this.nb = nb || 1;
|
|
this.checked = checked;
|
|
this.removed = false;
|
|
|
|
this.import = function (data) {
|
|
this.uuid = data.uuid || generate_uuid();
|
|
this.lastChange = data.lastChange || new Date().getTime();
|
|
(this.label = decodeURIComponent(data.label)), (this.nb = data.nb || 1);
|
|
this.checked = data.checked;
|
|
this.removed = data.removed || false;
|
|
};
|
|
|
|
this.reset = function () {
|
|
this.checked = false;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
|
|
this.export = function () {
|
|
return {
|
|
uuid: this.uuid,
|
|
lastChange: this.lastChange,
|
|
label: encodeURIComponent(this.label),
|
|
nb: this.nb,
|
|
checked: this.checked,
|
|
removed: this.removed,
|
|
};
|
|
};
|
|
|
|
this.setNb = function (nb) {
|
|
this.nb = nb;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
|
|
this.setChecked = function (value) {
|
|
this.checked = value;
|
|
this.lastChange = new Date().getTime();
|
|
console.log(
|
|
`Thing<${this.uuid}>.setChecked(${this.checked}): ${this.lastChange}`
|
|
);
|
|
};
|
|
|
|
this.remove = function () {
|
|
this.removed = true;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
|
|
this.restore = function () {
|
|
this.removed = false;
|
|
this.lastChange = new Date().getTime();
|
|
};
|
|
}
|
|
|
|
function User() {
|
|
this.username = null;
|
|
this.name = null;
|
|
this.token = null;
|
|
this.loadFromLocalStorage = function () {
|
|
if (jQuery.type(localStorage.user) == "undefined") return;
|
|
try {
|
|
var data = JSON.parse(localStorage.user);
|
|
this.username = data.username;
|
|
this.name = data.name;
|
|
this.token = data.token;
|
|
} catch (e) {
|
|
alert(_("Error loading your login information. Please log in again."));
|
|
}
|
|
};
|
|
|
|
this.connected = function () {
|
|
return this.username && this.token;
|
|
};
|
|
|
|
this.reset = function () {
|
|
this.username = null;
|
|
this.name = null;
|
|
this.token = null;
|
|
};
|
|
|
|
this.save = function () {
|
|
localStorage.user = JSON.stringify({
|
|
username: this.username,
|
|
name: this.name,
|
|
token: this.token,
|
|
});
|
|
};
|
|
}
|