You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
devdocs/assets/javascripts/collections/docs.js

125 lines
2.7 KiB

app.collections.Docs = class Docs extends app.Collection {
static model = "Doc";
static NORMALIZE_VERSION_RGX = /\.(\d)$/;
static NORMALIZE_VERSION_SUB = ".0$1";
// Load models concurrently.
// It's not pretty but I didn't want to import a promise library only for this.
static CONCURRENCY = 3;
findBySlug(slug) {
return (
this.findBy("slug", slug) || this.findBy("slug_without_version", slug)
);
}
sort() {
return this.models.sort((a, b) => {
if (a.name === b.name) {
if (
!a.version ||
a.version.replace(
Docs.NORMALIZE_VERSION_RGX,
Docs.NORMALIZE_VERSION_SUB,
) >
b.version.replace(
Docs.NORMALIZE_VERSION_RGX,
Docs.NORMALIZE_VERSION_SUB,
)
) {
return -1;
} else {
return 1;
}
} else if (a.name.toLowerCase() > b.name.toLowerCase()) {
return 1;
} else {
return -1;
}
});
}
load(onComplete, onError, options) {
let i = 0;
var next = () => {
if (i < this.models.length) {
this.models[i].load(next, fail, options);
} else if (i === this.models.length + Docs.CONCURRENCY - 1) {
onComplete();
}
i++;
};
var fail = function (...args) {
if (onError) {
onError(args);
onError = null;
}
next();
};
for (let j = 0, end = Docs.CONCURRENCY; j < end; j++) {
next();
}
}
clearCache() {
for (var doc of this.models) {
doc.clearCache();
}
}
uninstall(callback) {
let i = 0;
var next = () => {
if (i < this.models.length) {
this.models[i++].uninstall(next, next);
} else {
callback();
}
};
next();
}
getInstallStatuses(callback) {
app.db.versions(this.models, (statuses) => {
if (statuses) {
for (var key in statuses) {
var value = statuses[key];
statuses[key] = { installed: !!value, mtime: value };
}
}
callback(statuses);
});
}
checkForUpdates(callback) {
this.getInstallStatuses((statuses) => {
let i = 0;
if (statuses) {
for (var slug in statuses) {
var status = statuses[slug];
if (this.findBy("slug", slug).isOutdated(status)) {
i += 1;
}
}
}
callback(i);
});
}
updateInBackground() {
this.getInstallStatuses((statuses) => {
if (!statuses) {
return;
}
for (var slug in statuses) {
var status = statuses[slug];
var doc = this.findBy("slug", slug);
if (doc.isOutdated(status)) {
doc.install($.noop, $.noop);
}
}
});
}
};