diff --git a/public/editor.html b/public/editor.html
index 9d36eee..de3545b 100644
--- a/public/editor.html
+++ b/public/editor.html
@@ -312,80 +312,82 @@ function main_functions(app, vmName) {
if (!mode || mode == 'none') {
ace_mode = 'markdown';
}
- var attributeDoc = getAttributeFromDocSnapshot(app, attribute);
- if (attributeDoc) {
- var aceMode = require("ace/mode/" + ace_mode).Mode;
- editor.session.setMode(new aceMode());
- var currentMode = attributeDoc.mode;
- if (!currentMode) {
- currentMode = 'none';
- }
- app.debug && console.log('modes', attribute, currentMode, mode);
-
- if (currentMode != mode) {
- app.debug && console.log('mode differs', attribute, currentMode, mode);
- function doInsert(mode) {
- return mode && mode != 'none';
+ return getAttributeFromDocSnapshot(app, attribute, function (err, attributeDoc) {
+ if (attributeDoc) {
+ var aceMode = require("ace/mode/" + ace_mode).Mode;
+ editor.session.setMode(new aceMode());
+ var currentMode = attributeDoc.mode;
+ if (!currentMode) {
+ currentMode = 'none';
}
+ app.debug && console.log('modes', attribute, currentMode, mode);
- replaceAttributeDocKey(app, attribute, 'mode', mode, doInsert, function (err, result) {
- app.debug && console.log('err', err, 'result', result);
- });
+ if (currentMode != mode) {
+ app.debug && console.log('mode differs', attribute, currentMode, mode);
+ function doInsert(mode) {
+ return mode && mode != 'none';
+ }
+
+ replaceAttributeDocKey(app, attribute, 'mode', mode, doInsert, function (err, result) {
+ app.debug && console.log('err', err, 'result', result);
+ });
+ }
}
- }
+ });
},
setReadOnly: function (value) {
editor.ace.setReadOnly(value);
},
- setDoc: function (attribute, callback) {
+ setAttrDoc: function (attribute, callback) {
//noinspection JSUnresolvedFunction
editor.ace.setReadOnly(true);
- var attributeDoc = getAttributeFromDocSnapshot(app, attribute);
- var mode = (attributeDoc && attributeDoc.mode) || 'none';
- app.debug && console.log('setDoc attribute, mode', attribute.title, mode);
+ return getAttributeFromDocSnapshot(app, attribute, function (err, attributeDoc) {
+ var mode = (attributeDoc && attributeDoc.mode) || 'none';
+ app.debug && console.log('setAttrDoc attribute, mode', attribute.title, mode);
- this.setMode(attribute, mode);
+ callFunction(app, 'main').setMode(attribute, mode);
- if (editor.doc != null) {
- app.debug && console.log('current cursor position', editor.ace.getCursorPosition());
- callFunction(app, 'user').storeCurrentPosition(editor.doc.name, editor.ace.getCursorPosition());
- editor.doc.close();
- editor.doc.detach_ace();
- }
- loadAttributeTextDoc(app, attribute, function (error, newDoc) {
- if (error) {
- editor.ace.setReadOnly(true);
- console.error(error);
- return callback && callback(error);
+ if (editor.doc != null) {
+ app.debug && console.log('current cursor position', editor.ace.getCursorPosition());
+ callFunction(app, 'user').storeCurrentPosition(editor.doc.name, editor.ace.getCursorPosition());
+ editor.doc.close();
+ editor.doc.detach_ace();
}
- newDoc.on('error', function (err) {
- editor.ace.setReadOnly(true);
- return callback && callback(err);
- });
-
- editor.doc = newDoc;
-
- //noinspection JSUnresolvedFunction
- editor.doc.attach_ace(editor.ace);
- //noinspection JSUnresolvedFunction
-
- var moveTo = callFunction(app, 'user').getCurrentPosition(editor.doc.name);
- if (!(moveTo && moveTo.row && moveTo.column)) {
- moveTo = {
- row: 0,
- column: 0
+ loadAttributeTextDoc(app, attribute, function (error, newDoc) {
+ if (error) {
+ editor.ace.setReadOnly(true);
+ console.error(error);
+ return callback && callback(error);
}
- }
- app.debug && console.log('moveTo', moveTo);
- editor.ace.moveCursorToPosition(moveTo);
- editor.ace.centerSelection();
+ newDoc.on('error', function (err) {
+ editor.ace.setReadOnly(true);
+ return callback && callback(err);
+ });
- editor.ace.setReadOnly(false);
+ editor.doc = newDoc;
- editor.ace.focus(); //To focus the ace editor
- return callback && callback(null);
+ //noinspection JSUnresolvedFunction
+ editor.doc.attach_ace(editor.ace);
+ //noinspection JSUnresolvedFunction
+
+ var moveTo = callFunction(app, 'user').getCurrentPosition(editor.doc.name);
+ if (!(moveTo && moveTo.row && moveTo.column)) {
+ moveTo = {
+ row: 0,
+ column: 0
+ }
+ }
+ app.debug && console.log('moveTo', moveTo);
+ editor.ace.moveCursorToPosition(moveTo);
+ editor.ace.centerSelection();
+
+ editor.ace.setReadOnly(false);
+
+ editor.ace.focus(); //To focus the ace editor
+ return callback && callback(null);
+ });
});
}
}
@@ -437,6 +439,13 @@ function getAttributeLocation(attribute) {
}
}
+function getLocation(location) {
+ return {
+ collection: location.collection,
+ name: location.name
+ }
+}
+
// identifying attributes parent doc
function getDocId(attribute) {
return attribute
@@ -444,14 +453,24 @@ function getDocId(attribute) {
&& (attribute.collection + ':' + attribute.name);
}
-function getAttributeDoc(app, attribute) {
+function getAttributeDoc(app, attribute, callback) {
var docId = getDocId(attribute);
- return docId && app.doc[docId];
+ app.debug && console.log('getAttributeDoc attribute, docId', attribute, docId, app.doc);
+ if (docId && app.doc[docId]) {
+ return callback && callback(null, app.doc[docId]);
+ } else {
+ loadRawDoc(app, getLocation(attribute), function (err, attributeDoc) {
+ setDoc(app, docId, attributeDoc);
+ return getAttributeDoc(app, attribute, callback);
+ });
+ }
}
-function getAttributeFromDocSnapshot(app, attribute) {
- var doc = getAttributeDoc(app, attribute);
- return doc && doc.snapshot && doc.snapshot[attribute.attribute];
+function getAttributeFromDocSnapshot(app, attribute, callback) {
+ return getAttributeDoc(app, attribute, function (err, doc) {
+ app.debug && console.log('getAttributeFromDocSnapshot doc', doc);
+ return callback && callback( err, doc && doc.snapshot && doc.snapshot[attribute.attribute]);
+ });
}
function getAttributeUrl(attribute) {
@@ -459,25 +478,26 @@ function getAttributeUrl(attribute) {
}
function replaceAttributeDocKey(app, attribute, key, value, doInsert, callback) {
- var op = [];
- var attributeDoc = getAttributeDoc(app, attribute);
- if (attributeDoc && attributeDoc[key]) {
- app.debug && console.log('// remove', key);
- op.push({
- p: [attribute.attribute, key],
- od: attributeDoc[key]
+ return getAttributeDoc(app, attribute, function (err, attributeDoc) {
+ var op = [];
+ if (attributeDoc && attributeDoc[key]) {
+ app.debug && console.log('// remove', key);
+ op.push({
+ p: [attribute.attribute, key],
+ od: attributeDoc[key]
+ });
+ }
+ if (typeof doInsert == 'function' && doInsert(value) || doInsert) {
+ app.debug && console.log('//insert', key);
+ op.push({
+ p: [attribute.attribute, key],
+ oi: value
+ });
+ }
+ attributeDoc.submitOp(op, function (err, result) {
+ app.debug && console.log('err', err, 'result', result);
+ return callback && callback(err, result);
});
- }
- if (typeof doInsert == 'function' && doInsert(value) || doInsert) {
- app.debug && console.log('//insert', key);
- op.push({
- p: [attribute.attribute, key],
- oi: value
- });
- }
- attributeDoc.submitOp(op, function (err, result) {
- app.debug && console.log('err', err, 'result', result);
- return callback && callback(err, result);
});
}
@@ -513,17 +533,17 @@ function initViewModel_main(app, vmName) {
var viewModel = app.ko.mapping.fromJS(snapshot, mapping);
viewModel._selectedMode = app.ko.observable();
-
+ var self = this;
var noneAceMode = null;
/* does not get invalidated */
viewModel._noneMode = function () {
- if (!this.noneAceMode) {
- this.noneAceMode = _.find(viewModel._availableModes(),
+ if (!self.noneAceMode) {
+ self.noneAceMode = _.find(viewModel._availableModes(),
function (mode) {
return mode.ace() == 'none';
});
}
- return this.noneAceMode;
+ return self.noneAceMode;
};
viewModel._selectedMode(viewModel._noneMode());
@@ -538,50 +558,54 @@ function initViewModel_main(app, vmName) {
return equalAttributes(active, attribute);
};
- viewModel._getModeForAttribute = function (attribute) {
+ viewModel._getModeForAttribute = function (attribute, callback) {
if (!attribute) {
- return viewModel._noneMode();
- }
- var attributeDoc = getAttributeFromDocSnapshot(app, attribute);
- var docMode = (attributeDoc && attributeDoc.mode);
- if (!docMode) {
- return viewModel._noneMode();
- }
- var mode = _.find(viewModel._availableModes(),
- function (mode) {
- return docMode == mode.ace();
- });
- if (mode) {
- app.debug && console.log('getModeForAttribute', mode);
- return mode;
- } else {
- return viewModel._noneMode();
+ return callback && callback(null, viewModel._noneMode());
}
+ return getAttributeFromDocSnapshot(app, attribute, function (err, attributeDoc) {
+ var docMode = (attributeDoc && attributeDoc.mode);
+ app.debug && console.log('_getModeForAttribute attribute, docMode', attribute, docMode);
+ if (!docMode) {
+ return callback && callback(null, viewModel._noneMode());
+ }
+ var mode = _.find(viewModel._availableModes(),
+ function (mode) {
+ app.debug && console.log('_getModeForAttribute mode.ace()', mode.ace());
+ return docMode == mode.ace();
+ });
+ if (mode) {
+ app.debug && console.log('_getModeForAttribute', mode);
+ return callback && callback(null, mode);
+ } else {
+ return callback && callback(null, viewModel._noneMode());
+ }
+ });
};
- viewModel._getExtensionForAttribute = function (attribute) {
- var mode = viewModel._getModeForAttribute(attribute);
- if (mode && mode.ace() == 'markdown') {
- return '.md';
- } else {
- return '.html';
- }
+ viewModel._getExtensionForAttribute = function (attribute, callback) {
+ return viewModel._getModeForAttribute(attribute, function (err, mode) {
+ if (mode && mode.ace() == 'markdown') {
+ return callback && callback(null, '.md');
+ }
+ return callback && callback(null, '.html');
+ });
};
- viewModel._getModeForChosenAttribute = function () {
+ viewModel._getModeForChosenAttribute = function (callback) {
var attribute = viewModel._chosenAttribute();
app.debug && console.log('getModeForChosenAttribute._chosenAttribute', attribute);
- return viewModel._getModeForAttribute(attribute)
+ return viewModel._getModeForAttribute(attribute, callback)
};
viewModel._updateSelectedMode = function () {
- var selectedMode = viewModel._getModeForChosenAttribute();
- app.debug && console.log('updateSelectedMode.getModeForChosenAttribute', selectedMode);
- if (selectedMode) {
- app.debug && console.log('setSelectedMode:', selectedMode.ace());
- viewModel._selectedMode(selectedMode);
- }
+ return viewModel._getModeForChosenAttribute(function (err, selectedMode) {
+ app.debug && console.log('updateSelectedMode.getModeForChosenAttribute', selectedMode);
+ if (selectedMode) {
+ app.debug && console.log('setSelectedMode:', selectedMode.ace());
+ return viewModel._selectedMode(selectedMode);
+ }
+ });
};
var activeAttribute = callFunction(app, 'user').getActiveAttributes();
@@ -591,7 +615,7 @@ function initViewModel_main(app, vmName) {
app.debug && console.log('_goToAttribute',attribute);
viewModel._chosenAttribute(attribute);
viewModel._updateSelectedMode();
- callFunction(app, 'main').setDoc(attribute, function (err) {
+ callFunction(app, 'main').setAttrDoc(attribute, function (err) {
if (!_.find(
viewModel._activeAttributes(),
function (active) {
@@ -599,7 +623,6 @@ function initViewModel_main(app, vmName) {
}
)) { // TODO: do not update viewmodel, instead update sharedoc.
callFunction(app, 'user').addActiveAttribute(attribute);
- //viewModel._activeAttributes.push(attribute);
}
});
};
@@ -608,20 +631,25 @@ function initViewModel_main(app, vmName) {
viewModel._previewAttribute = function () {
var attribute = viewModel._chosenAttribute();
if (attribute) {
- var ext = viewModel._getExtensionForAttribute(attribute);
- var url = '/page/' + getAttributeUrl(attribute) + ext + '#!watch';
- open_in_new_tab(url);
+ return viewModel._getExtensionForAttribute(attribute, function (err, ext) {
+ var url = '/page/' + getAttributeUrl(attribute) + ext + '#!watch';
+ open_in_new_tab(url);
+ });
}
};
- viewModel._getMode = app.ko.computed(function () {
+ viewModel._getMode = app.ko.observable();
+
+ viewModel._computeMode = app.ko.computed(function () {
var attribute = viewModel._chosenAttribute();
- if (!attribute) return attribute;
-
- var attributeDoc = getAttributeFromDocSnapshot(app, attribute);
-
- return attribute && attributeDoc && attributeDoc.mode;
+ if (!attribute) {
+ return viewModel._getMode(attribute);
+ } else {
+ return getAttributeFromDocSnapshot(app, attribute, function (err, attributeDoc) {
+ return viewModel._getMode(attribute && attributeDoc && attributeDoc.mode);
+ });
+ }
});
viewModel._selectedMode.subscribe(function (newValue) {
@@ -931,6 +959,7 @@ function setDoc(app, docId, doc) {
if (!app.doc) {
app['doc'] = {};
}
+ app.debug && console.log('setDoc docId, doc', docId, doc);
app.doc[docId] = doc;
}
@@ -1058,7 +1087,7 @@ function ensureIndexesOnAttributes(snapshot) {
var maxAttribute = _.max(snapshot._attributes, function (attributeName) {
return snapshot[attributeName].index;
});
- var max = maxAttribute && snapshot[maxAttribute].index || 0;
+ var max = maxAttribute && snapshot[maxAttribute] && snapshot[maxAttribute].index || 0;
_.forEach(snapshot._attributes, function (attributeName,index) {
if (!snapshot[attributeName].hasOwnProperty('index')) {
max += 1;
@@ -1068,7 +1097,7 @@ function ensureIndexesOnAttributes(snapshot) {
p: path,
oi: max
});
- snapshot[attributeName].index=max;
+ snapshot[attributeName].index = max;
}
});
}