Import a template into a spreadsheet
parent
174c71d130
commit
26ef547e84
|
@ -639,6 +639,7 @@ define([
|
|||
button
|
||||
.click(common.prepareFeedback(type))
|
||||
.click(function () {
|
||||
if (callback) { return void callback(); }
|
||||
UIElements.openTemplatePicker(common, true);
|
||||
});
|
||||
break;
|
||||
|
|
|
@ -637,6 +637,7 @@ define([
|
|||
if (!val) {
|
||||
return void cb('ENOENT');
|
||||
}
|
||||
if (data.oo) { return void cb(val); } // OnlyOffice template: are handled in inner
|
||||
try {
|
||||
// Try to fix the title before importing the template
|
||||
var parsed = JSON.parse(val);
|
||||
|
|
|
@ -416,7 +416,7 @@ define([
|
|||
clearTimeout(pendingChanges[key]);
|
||||
delete pendingChanges[key];
|
||||
});
|
||||
if (APP.stopHistory) { APP.history = false; }
|
||||
if (APP.stopHistory || APP.template) { APP.history = false; }
|
||||
startOO(blob, type, true);
|
||||
};
|
||||
|
||||
|
@ -426,14 +426,15 @@ define([
|
|||
var file = getFileType();
|
||||
blob.name = (metadataMgr.getMetadataLazy().title || file.doc) + '.' + file.type;
|
||||
var data = {
|
||||
hash: APP.history ? ooChannel.historyLastHash : ooChannel.lastHash,
|
||||
index: APP.history ? ooChannel.currentIndex : ooChannel.cpIndex
|
||||
hash: (APP.history || APP.template) ? ooChannel.historyLastHash : ooChannel.lastHash,
|
||||
index: (APP.history || APP.template) ? ooChannel.currentIndex : ooChannel.cpIndex
|
||||
};
|
||||
fixSheets();
|
||||
|
||||
ooChannel.ready = false;
|
||||
ooChannel.queue = [];
|
||||
data.callback = function () {
|
||||
if (APP.template) { APP.template = false; }
|
||||
resetData(blob, file);
|
||||
};
|
||||
|
||||
|
@ -1296,6 +1297,13 @@ define([
|
|||
}
|
||||
}
|
||||
|
||||
if (APP.template) {
|
||||
getEditor().setViewModeDisconnect();
|
||||
UI.removeLoadingScreen();
|
||||
makeCheckpoint(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (APP.history) {
|
||||
try {
|
||||
getEditor().asc_setRestriction(true);
|
||||
|
@ -1829,6 +1837,108 @@ define([
|
|||
pinImages();
|
||||
};
|
||||
|
||||
var loadCp = function (cp, keepQueue) {
|
||||
loadLastDocument(cp, function () {
|
||||
var file = getFileType();
|
||||
var type = common.getMetadataMgr().getPrivateData().ooType;
|
||||
var blob = loadInitDocument(type, true);
|
||||
if (!keepQueue) { ooChannel.queue = []; }
|
||||
resetData(blob, file);
|
||||
}, function (blob, file) {
|
||||
if (!keepQueue) { ooChannel.queue = []; }
|
||||
resetData(blob, file);
|
||||
});
|
||||
};
|
||||
|
||||
var loadTemplate = function (href, pw, parsed) {
|
||||
APP.history = true;
|
||||
APP.template = true;
|
||||
getEditor().setViewModeDisconnect();
|
||||
var content = parsed.content;
|
||||
|
||||
// Get checkpoint
|
||||
var hashes = content.hashes || {};
|
||||
var idx = sortCpIndex(hashes);
|
||||
var lastIndex = idx[idx.length - 1];
|
||||
var lastCp = hashes[lastIndex];
|
||||
|
||||
// Current cp or initial hash (invalid hash ==> initial hash)
|
||||
var toHash = lastCp.hash || 'NONE';
|
||||
// Last hash
|
||||
var fromHash = 'NONE';
|
||||
|
||||
sframeChan.query('Q_GET_HISTORY_RANGE', {
|
||||
href: href,
|
||||
password: pw,
|
||||
channel: content.channel,
|
||||
lastKnownHash: fromHash,
|
||||
toHash: toHash,
|
||||
}, function (err, data) {
|
||||
if (err) { return void console.error(err); }
|
||||
if (!Array.isArray(data.messages)) { return void console.error('Not an array!'); }
|
||||
|
||||
// The first "cp" in history is the empty doc. It doesn't include the first patch
|
||||
// of the history
|
||||
var initialCp = !lastCp.hash;
|
||||
|
||||
var messages = (data.messages || []).slice(initialCp ? 0 : 1);
|
||||
|
||||
ooChannel.queue = messages.map(function (obj) {
|
||||
return {
|
||||
hash: obj.serverHash,
|
||||
msg: JSON.parse(obj.msg)
|
||||
};
|
||||
});
|
||||
ooChannel.historyLastHash = ooChannel.lastHash;
|
||||
ooChannel.currentIndex = ooChannel.cpIndex;
|
||||
console.error(ooChannel.historyLastHash);
|
||||
loadCp(lastCp, true);
|
||||
});
|
||||
};
|
||||
|
||||
var openTemplatePicker = function () {
|
||||
var metadataMgr = common.getMetadataMgr();
|
||||
var type = metadataMgr.getPrivateData().app;
|
||||
var sframeChan = common.getSframeChannel();
|
||||
var pickerCfgInit = {
|
||||
types: [type],
|
||||
where: ['template'],
|
||||
hidden: true
|
||||
};
|
||||
var pickerCfg = {
|
||||
types: [type],
|
||||
where: ['template'],
|
||||
};
|
||||
var onConfirm = function () {
|
||||
common.openFilePicker(pickerCfg, function (data) {
|
||||
if (data.type !== type) { return; }
|
||||
UI.addLoadingScreen({hideTips: true});
|
||||
sframeChan.query('Q_OO_TEMPLATE_USE', {
|
||||
href: data.href,
|
||||
}, function (err, val) {
|
||||
var parsed;
|
||||
try {
|
||||
parsed = JSON.parse(val);
|
||||
} catch (e) {
|
||||
console.error(e, val);
|
||||
UI.removeLoadingScreen();
|
||||
return void UI.warn(Messages.error);
|
||||
}
|
||||
console.error(data);
|
||||
loadTemplate(data.href, data.password, parsed);
|
||||
});
|
||||
});
|
||||
};
|
||||
sframeChan.query("Q_TEMPLATE_EXIST", type, function (err, data) {
|
||||
if (data) {
|
||||
common.openFilePicker(pickerCfgInit);
|
||||
onConfirm();
|
||||
} else {
|
||||
UI.alert(Messages.template_empty);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
config.onInit = function (info) {
|
||||
var privateData = metadataMgr.getPrivateData();
|
||||
|
||||
|
@ -1850,6 +1960,7 @@ define([
|
|||
Title.setToolbar(toolbar);
|
||||
|
||||
if (window.CP_DEV_MODE) {
|
||||
|
||||
var $save = common.createButton('save', true, {}, function () {
|
||||
makeCheckpoint(true);
|
||||
});
|
||||
|
@ -1866,18 +1977,6 @@ define([
|
|||
APP.stopHistory = true;
|
||||
makeCheckpoint(true);
|
||||
};
|
||||
var loadCp = function (cp, keepQueue) {
|
||||
loadLastDocument(cp, function () {
|
||||
var file = getFileType();
|
||||
var type = common.getMetadataMgr().getPrivateData().ooType;
|
||||
var blob = loadInitDocument(type, true);
|
||||
if (!keepQueue) { ooChannel.queue = []; }
|
||||
resetData(blob, file);
|
||||
}, function (blob, file) {
|
||||
if (!keepQueue) { ooChannel.queue = []; }
|
||||
resetData(blob, file);
|
||||
});
|
||||
};
|
||||
var onPatch = function (patch) {
|
||||
// Patch on the current cp
|
||||
ooChannel.send(JSON.parse(patch.msg));
|
||||
|
@ -1971,6 +2070,10 @@ define([
|
|||
load: loadSnapshot
|
||||
});
|
||||
toolbar.$drawer.append($snapshot);
|
||||
|
||||
// Import template
|
||||
var $template = common.createButton('importtemplate', true, {}, openTemplatePicker);
|
||||
$template.appendTo(toolbar.$drawer);
|
||||
})();
|
||||
}
|
||||
|
||||
|
|
|
@ -1102,6 +1102,10 @@ define([
|
|||
nSecret = Utils.Hash.getSecrets('drive', hash, password);
|
||||
}
|
||||
}
|
||||
if (data.href) {
|
||||
var _parsed = Utils.Hash.parsePadUrl(data.href);
|
||||
nSecret = Utils.Hash.getSecrets(_parsed.type, _parsed.hash, data.password);
|
||||
}
|
||||
var channel = nSecret.channel;
|
||||
var validate = nSecret.keys.validateKey;
|
||||
var crypto = Crypto.createEncryptor(nSecret.keys);
|
||||
|
@ -1282,6 +1286,10 @@ define([
|
|||
sframeChan.on('Q_TEMPLATE_USE', function (data, cb) {
|
||||
Cryptpad.useTemplate(data, Cryptget, cb);
|
||||
});
|
||||
sframeChan.on('Q_OO_TEMPLATE_USE', function (data, cb) {
|
||||
data.oo = true;
|
||||
Cryptpad.useTemplate(data, Cryptget, cb);
|
||||
});
|
||||
sframeChan.on('Q_TEMPLATE_EXIST', function (type, cb) {
|
||||
Cryptpad.listTemplates(type, function (err, templates) {
|
||||
cb(templates.length > 0);
|
||||
|
|
|
@ -124,6 +124,7 @@ define([
|
|||
}
|
||||
sframeChan.event("EV_SECURE_ACTION", {
|
||||
type: parsed.type,
|
||||
password: data.password,
|
||||
href: data.url,
|
||||
name: data.name
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue