public/src/js/models/base-model.js (88 lines of code) (raw):
import ko from 'knockout';
import _ from 'underscore';
import {CONST} from 'modules/vars';
import BaseClass from 'models/base-class';
import Layout from 'models/layout';
import * as widgets from 'models/widgets';
import copiedArticle from 'modules/copied-article';
import Droppable from 'modules/droppable';
import modalDialog from 'modules/modal-dialog';
import message from 'widgets/message';
import priorityFromUrl from 'utils/priority-from-url';
var droppableSym = Symbol();
export default class BaseModel extends BaseClass {
constructor(enabledWidgets, extensions, router, res) {
super();
var layout = new Layout(router, enabledWidgets, this);
this.title = ko.observable('story packages');
this.layout = layout;
this.extensions = ko.observableArray(extensions || []);
this.modalDialog = modalDialog;
this.message = message;
this.state = ko.observable();
this.latestPackages = ko.observableArray();
this.switches = ko.observable();
this.permissions = ko.observable();
this.pending = ko.observable(true);
this.isMainActionVisible = ko.observable(false);
this.priority = priorityFromUrl(router.location.pathname);
this.fullPriority = this.priority || CONST.defaultPriority;
this.liveFrontend = CONST.environmentUrlBase[res.defaults.env] || ('http://' + CONST.mainDomain + '/');
this.identity = {
email: res.defaults.email,
avatarUrl: res.defaults.avatarUrl
};
this.update(res);
this[droppableSym] = new Droppable();
copiedArticle.flush();
widgets.register();
this.loaded = waitFor(this, layout, extensions).then(() => {
this.pending(false);
return this;
});
}
chooseLayout() {
this.layout.toggleConfigVisible();
this.isMainActionVisible(false);
}
saveLayout() {
this.layout.save();
}
cancelLayout() {
this.layout.cancel();
}
update(res) {
if (!_.isEqual(this.switches(), res.defaults.switches)) {
this.switches(res.defaults.switches);
}
if (!_.isEqual(this.permissions(), res.defaults.acl)) {
this.permissions(res.defaults.acl);
}
// State must be changed last
this.state(res);
}
dispose() {
super.dispose();
ko.cleanNode(window.document.body);
this[droppableSym].dispose();
this.layout.dispose();
}
}
function waitFor (model, layout, extensions) {
var extensionsLoadedInDom,
extensionsClassesLoaded,
extensionsLoadedPromise = extensions.length ? new Promise(resolve => {
extensionsLoadedInDom = _.after(extensions.length, resolve);
}): Promise.resolve(),
extensionsClassesPromise = extensions.length ? new Promise(resolve => {
extensionsClassesLoaded = _.after(extensions.length, resolve);
}): Promise.resolve();
model.registerExtension = () => {
extensionsLoadedInDom();
};
model.extensionCreated = () => {
extensionsClassesLoaded();
};
return extensionsLoadedPromise
.then(() => extensionsClassesPromise)
.then(() => layout.init());
}